In PostgreSQL is de EXCEPT
operator retourneert rijen die worden geretourneerd door de linkerinvoerquery die niet worden geretourneerd door de rechterinvoerquery. Dit kan ook worden aangeduid als het verschil tussen twee zoekopdrachten.
Syntaxis
De syntaxis gaat als volgt:
query1 EXCEPT [ALL] query2
Duplicaten worden verwijderd tenzij EXCEPT ALL
wordt gebruikt.
Voorbeeld
Stel dat we de volgende tabellen hebben:
SELECT * FROM Teachers;
SELECT * FROM Students;
Resultaat:
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
We kunnen de EXCEPT
. gebruiken operator om docenten terug te sturen die niet ook studenten zijn:
SELECT TeacherName FROM Teachers
EXCEPT
SELECT StudentName FROM Students;
Resultaat:
teachername ------------- Cathy Ben
We krijgen dus alleen waarden die voorkomen in de Teachers
tabel die niet ook voorkomt in de Students
tafel.
Standaard is de EXCEPT
operator geeft verschillende rijen terug. Dus in ons voorbeeld wordt slechts één rij geretourneerd voor Cathy
, ook al zijn er twee leraren met die naam.
Het bovenstaande voorbeeld is het equivalent van de volgende zoekopdracht:
SELECT TeacherName FROM Teachers
EXCEPT DISTINCT
SELECT StudentName FROM Students;
Resultaat:
teachername ------------- Cathy Ben
Dit is hetzelfde resultaat dat we kregen toen er geen expliciete DISTINCT
. was trefwoord. We kunnen duplicaten opnemen met de ALL
trefwoord (hierover later meer).
We kunnen verschillende resultaten krijgen, afhankelijk van welke tabel aan de linkerkant is en welke aan de rechterkant. Hier is een voorbeeld waarin de Students
tabel aan de linkerkant en Teachers
aan de rechterkant:
SELECT StudentName FROM Students
EXCEPT
SELECT TeacherName FROM Teachers;
Resultaat:
studentname ------------- Faye Jet Spike Ein
Deze keer krijgen we leerlingen die niet ook leraar zijn.
Duplicaten opnemen
Standaard is de EXCEPT
operator past impliciet een DISTINCT
toe operatie. Met andere woorden, het retourneert standaard alleen afzonderlijke waarden.
We kunnen de ALL
zoekwoord om duplicaten in ons resultaat op te nemen:
SELECT TeacherName FROM Teachers
EXCEPT ALL
SELECT StudentName FROM Students;
Resultaat:
teachername ------------- Cathy Cathy Bill Ben
Deze keer kregen we vier rijen, in plaats van de twee die we in ons eerste voorbeeld kregen.
We kunnen zien dat beide Cathy's zijn geretourneerd in plaats van slechts één zoals in ons eerste voorbeeld.
Wat betreft Bill? Er zijn twee rekeningen in de Teachers
tabel, maar er wordt hier slechts één geretourneerd. Dat komt waarschijnlijk omdat er één rekening is in de Students
tabel, die een van de rekeningen van onze resultaten zou uitsluiten.
Een alternatief
Het is mogelijk om hetzelfde resultaat te krijgen zonder de EXCEPT
exploitant. We zouden ons eerste voorbeeld hier bijvoorbeeld naar kunnen herschrijven:
SELECT
DISTINCT TeacherName
FROM Teachers t
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName);
Resultaat:
teachername ------------- Cathy Ben