I PostgreSQL, EXCEPT
operatorn returnerar rader som returneras av den vänstra inmatningsfrågan som inte returneras av den högra inmatningsfrågan. Detta kan också kallas skillnaden mellan två frågor.
Syntax
Syntaxen ser ut så här:
query1 EXCEPT [ALL] query2
Dubbletter elimineras om inte EXCEPT ALL
används.
Exempel
Anta att vi har följande tabeller:
SELECT * FROM Teachers;
SELECT * FROM Students;
Resultat:
teacherid | teachername -----------+------------- 1 | Warren 2 | Ben 3 | Cathy 4 | Cathy 5 | Bill 6 | Bill studentid | studentname -----------+------------- 1 | Faye 2 | Jet 3 | Spike 4 | Ein 5 | Warren 6 | Bill
Vi kan använda EXCEPT
operatör för att returnera lärare som inte också är elever:
SELECT TeacherName FROM Teachers
EXCEPT
SELECT StudentName FROM Students;
Resultat:
teachername ------------- Cathy Ben
Så vi får bara värden som visas i Teachers
tabell som inte också visas i Students
tabell.
Som standard är EXCEPT
operatorn returnerar distinkta rader. Så i vårt exempel returneras bara en rad för Cathy
, även om det finns två lärare med det namnet.
Exemplet ovan motsvarar följande fråga:
SELECT TeacherName FROM Teachers
EXCEPT DISTINCT
SELECT StudentName FROM Students;
Resultat:
teachername ------------- Cathy Ben
Detta är samma resultat som vi fick när det inte fanns någon explicit DISTINCT
nyckelord. Vi kan inkludera dubbletter med ALL
nyckelord (mer om detta senare).
Vi kan få olika resultat, beroende på vilken tabell som är till vänster och vilken som är till höger. Här är ett exempel som sätter Students
tabellen till vänster och Teachers
till höger:
SELECT StudentName FROM Students
EXCEPT
SELECT TeacherName FROM Teachers;
Resultat:
studentname ------------- Faye Jet Spike Ein
Den här gången får vi elever som inte också är lärare.
Inkludera dubbletter
Som standard är EXCEPT
operatorn tillämpar implicit en DISTINCT
drift. Med andra ord returnerar den endast distinkta värden som standard.
Vi kan inkludera ALL
sökord för att inkludera dubbletter i vårt resultat:
SELECT TeacherName FROM Teachers
EXCEPT ALL
SELECT StudentName FROM Students;
Resultat:
teachername ------------- Cathy Cathy Bill Ben
Den här gången fick vi fyra rader, istället för de två som vi fick i vårt första exempel.
Vi kan se att båda Cathys returnerades istället för bara en som i vårt första exempel.
Vad gäller Bill? Det finns två räkningar i Teachers
tabell, men bara en returneras här. Det beror förmodligen på att det finns en faktura i Students
tabell, vilket skulle utesluta en av räkningarna från våra resultat.
Ett alternativ
Det är möjligt att få samma resultat utan att använda EXCEPT
operatör. Till exempel skulle vi kunna skriva om vårt första exempel till detta:
SELECT
DISTINCT TeacherName
FROM Teachers t
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName);
Resultat:
teachername ------------- Cathy Ben