2016-06-20 8 views
0

Frage:Feststecken auf Oracle-Ausgabe

Anzeigen Nachname, Gehalt und Job für alle Mitarbeiter, die mehr als alle am niedrigsten bezahlten Mitarbeiter pro Abteilung außerhalb der US-Standorte verdienen. Schließen Sie President und Vice Presidents von dieser Abfrage aus. (Verwenden Sie subquery/join)

Ich bin nicht sicher, wie dies die Unterabfrage richtig

richtig zu strukturieren das ist, was ich versucht habe:

SELECT last_name, salary, job_id 
FROM employees join locations 
USING(department_id) 
WHERE job_id <> ANY (SELECT * 
        FROM employees 
        WHERE job_id <> 'AD_PRES' OR job_id <> 'AD_VP') 
AND salary > 
        (SELECT MIN(salary) 
        FROM employees 
        WHERE country_id <> 'US'); 

Jede Hilfe, wie man dies richtig strukturieren wird geschätzt . Vielen Dank.

+0

Tabelle DEPARTMENTS und Mitarbeiter Tabelle sind nur 2 mit department_id – bp06km

Antwort

0
SELECT 
    last_name, salary, job_id 
FROM employees a 
INNER JOIN locations b ON a.department_id = b.department_id 
WHERE a.job_id NOT IN (
    SELECT job_id 
    FROM employees 
    WHERE 
     (job_id <> 'AD_PRES' OR job_id <> 'AD_VP') AND 
     salary > (
      SELECT MIN(salary) 
      FROM employees 
      WHERE country_id <> 'US' 
     ) 
); 

Funktioniert?

+0

ORA-00904: "B" "DEPARTMENT_ID": ungültige Kennung 00904. 00000 -. "% S: ungültige Kennung" * Ursache: * Aktion: Fehler in Zeile : 4 Spalte: 45 – bp06km

+0

ah LOCATIONS Tabelle hat keine department_id Attribut – bp06km

+0

Standorte hat nur die Informationen für den Ländernamen – bp06km

2
SELECT last_name, 
     salary, 
     job_id 
FROM (
    SELECT last_name, 
     salary, 
     job_id, 
     RANK() OVER (PARTITION BY e.department_id ORDER BY salary) AS rnk 
    FROM employees e 
     INNER JOIN 
     departments d 
     ON (d.department_id = e.department_id) 
     INNER JOIN 
     locations l 
     ON (d.location_id = l.location_id) 
    WHERE e.job_id NOT IN ('AD_PRES', 'AD_VP') 
    AND l.country_id <> 'US' 
) 
WHERE rnk > 1; 

Output:

LAST_NAME      SALARY JOB_ID 
------------------------- ---------- ---------- 
Hartstein      13000 MK_MAN  
Banda       6200 SA_REP  
Johnson       6200 SA_REP  
Ande       6400 SA_REP  
Lee        6800 SA_REP  
Sewall       7000 SA_REP  
Tuvault       7000 SA_REP  
Marvins       7200 SA_REP  
Bates       7300 SA_REP  
Smith       7400 SA_REP  
Cambrault      7500 SA_REP  
Doran       7500 SA_REP  
Smith       8000 SA_REP  
Olsen       8000 SA_REP  
Livingston      8400 SA_REP  
Taylor       8600 SA_REP  
Hutton       8800 SA_REP  
Hall       9000 SA_REP  
McEwen       9000 SA_REP  
Sully       9500 SA_REP  
Bernstein      9500 SA_REP  
Greene       9500 SA_REP  
Fox        9600 SA_REP  
Bloom       10000 SA_REP  
Tucker       10000 SA_REP  
King       10000 SA_REP  
Zlotkey      10500 SA_MAN  
Vishney      10500 SA_REP  
Cambrault      11000 SA_MAN  
Abel       11000 SA_REP  
Ozer       11500 SA_REP  
Errazuriz      12000 SA_MAN  
Partners      13500 SA_MAN  
Russell      14000 SA_MAN 

Abfrage 2 - ohne analytischen Funktionen unter Verwendung:

SELECT last_name, 
     salary, 
     job_id 
FROM employees e 
     INNER JOIN 
     departments d 
     ON (d.department_id = e.department_id) 
     INNER JOIN 
     locations l 
     ON (d.location_id = l.location_id) 
WHERE e.job_id NOT IN ('AD_PRES', 'AD_VP') 
AND l.country_id <> 'US' 
AND e.salary > ANY(SELECT salary 
         FROM employees ee 
         WHERE ee.department_id = e.department_id); 

oder

AND e.salary > (SELECT MIN(salary) 
        FROM employees ee 
        WHERE ee.department_id = e.department_id); 
+0

ORA-00904: "L" "DEPARTMENT_ID": ungültige Kennung 00904. 00000 -. "% S: ungültige Kennung" * Ursache: * Aktion: Fehler in Zeile: 12 Column: 15 – bp06km

+0

@ bp06km Aktualisiert – MT0

+0

That funktioniert. Kannst du erklären, was Rank() genauso gut macht wie PARTITION BY? DANK – bp06km

Verwandte Themen