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