ORACLE: mehrere Spalte Unterabfragen
Dies ist von Oracle Database 10g: SQL-Grundlagen.
Original-Oracle-lehrbuch.
Francly sprechen, dies alles ist tatsächlich so weit.
Es ist eine Aufgabe, die mich beunruhigt:
Anzeige der Nachname, Abteilung, name und Gehalt jedes Mitarbeiters, dessen Gehalt und Kommission übereinstimmen, das Gehalt und die Kommission der vielen Mitarbeiter, die sich in Standort-ID 1700.
Dem Thema gelernt werden soll, mehrere Spalte Unterabfragen. Dies bedeutet, dass können wir nicht abweichen von dem angebotenen Modell:
SELECT column, column, ...
FROM table
WHERE (column, column, ...) IN
(SELECT column, column, ...
FROM table
WHERE condition);
Gut, meine Datenbank:
describe employees
Name Null Type
-------------- -------- ------------
EMPLOYEE_ID NOT NULL NUMBER(6)
FIRST_NAME VARCHAR2(20)
LAST_NAME NOT NULL VARCHAR2(25)
EMAIL NOT NULL VARCHAR2(25)
PHONE_NUMBER VARCHAR2(20)
HIRE_DATE NOT NULL DATE
JOB_ID NOT NULL VARCHAR2(10)
SALARY NUMBER(8,2)
COMMISSION_PCT NUMBER(2,2)
MANAGER_ID NUMBER(6)
DEPARTMENT_ID NUMBER(4)
describe departments
Name Null Type
--------------- -------- ------------
DEPARTMENT_ID NOT NULL NUMBER(4)
DEPARTMENT_NAME NOT NULL VARCHAR2(30)
MANAGER_ID NUMBER(6)
LOCATION_ID NUMBER(4)
Gibt es eine Lösung:
select
e.last_name,
d.department_name,
e.salary
from employees e, departments d
where e.department_id = d.department_id
and (salary, nvl(commission_pct, 0)) in
(select salary, nvl(commission_pct, 0)
from employees e, departments d
where e.department_id = d.department_id
and d.location_id = 1700);
AUSGEWÄHLTEN 36 ZEILEN.
Gut, ich begann die überprüfung. Es scheint, dass Mitarbeiter vom Standort 1700 dupliziert gegen sich selbst.
Schauen Sie: wir übernehmen die gesamte Liste der Mitarbeiter und dann konfrontieren Sie mit den Mitarbeitern vom Standort 1700. Natürlich gibt es Duplikate.
Vorbereitet habe ich eine excel-Datei mit einigen Daten (alle Mitarbeiter, Mitarbeiter aus der Standort-1700, das Ergebnis meiner eigenen gewünschten Ergebnis etc.). In der Datei, es ist malerischer, mit Beispielen und so weiter. Bitte haben Sie einen Blick.
Dies ist die Datei: https://skydrive.live.com/redir?resid=8CDFFBA921B002FE!150&authkey=!ADMRAE466BIunQM
Gut, was ich tun möchte, ist zu kontrollieren, dass kein Mitarbeiter ist im Vergleich mit sich selbst.
Dies war meine Variante bevore ich habe die Lösung.
select lnme, dpt, slry
from
(
select
employee_id eid,
last_name lnme,
salary slry,
nvl(commission_pct,0) cpct,
d.department_name dpt,
location_id
from employees e
left join departments d
on e.department_id = d.department_id
)
where (slry, cpct) in
(select
employee_id ide,
salary slry,
nvl(commission_pct,0) cpct
from employees e
join departments d
on e.department_id = d.department_id and location_id = 1700)
and ide <> eid
Wollte ich sicherstellen, dass kein Mitarbeiter ist im Vergleich mit dem gleichen Mitarbeiter. Aber ich konnte nicht.
Könnte Sie kommentieren alle diese situation:
1. Ob ich völlig falsch und die Lösung von Oracle ist perfekt.
2. Wenn Oracle ist falsch, könnten Sie mir helfen mit diesem code?
Vielen Dank im Voraus.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Frage fordert Sie auf, identifizieren jeder Mitarbeiter, deren Gehalt und provision entspricht einer beliebigen Kombination von Lohn und Gehalt der Mitarbeiter in der Abteilung 1700. Die Frage sagt nicht auszuschließen Mitarbeiter aus dieser Abteilung. So ist es durchaus richtig für Sie ist, um im ResultSet angezeigt.
Du bist nicht die passenden Mitarbeiter sind Sie passende Gehälter . Es passiert einfach so, dass die Liste der Ziel-Gehälter wurde aus einer sub-query auf der Abteilung 1700: es könnte genauso gut eine Liste von zahlen aus einer CSV-Datei.
Wir haben ein Gedanken-experiment. Es sind drei Mitarbeiter in der Abteilung 1700:
Sonst niemand in der Firma verdient über 10K.
Also, was ist die Antwort auf die Frage: wie viele Mitarbeiter haben ein Gehalt, und der Kommission, die mit dem Gehalt und provision eines Mitarbeiters befindet sich in der Abteilung 1700?
Dann Joe bekommt eine bescheidene erhöhen und die Gehälter so Aussehen:
Also, was ist die Antwort auf die gleiche Frage jetzt?
Die Antwort ist "drei" in beiden Fällen.
Warum?
Da SQL ist eine set-basierte Programmiersprache, und die Menge aller Mitarbeiter, die verdienen das genaue Gehalt und die Kommission als Mitarbeiter in der Abteilung 1700 müssen alle Mitarbeiter, die in der Abteilung 1700.
Gibt es eine andere Gruppe, also die Gruppe aller Mitarbeiter, die verdienen das genaue Gehalt und die Kommission als Mitarbeiter in der Abteilung 1700, die nicht selbst arbeiten in der Abteilung 1700. Aber das ist nicht der Satz der SQL-Grundlagen quiz ist suchen.
... AND e.department_id != 1700
.