I PostgreSQL er EXCEPT
operator returnerer rækker, der returneres af den venstre inputforespørgsel, som ikke returneres af den højre inputforespørgsel. Dette kan også kaldes forskellen mellem to forespørgsler.
Syntaks
Syntaksen ser sådan ud:
query1 EXCEPT [ALL] query2
Dubletter elimineres, medmindre EXCEPT ALL
bruges.
Eksempel
Antag, at vi har følgende 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 bruge EXCEPT
operatør for at returnere lærere, der ikke også er studerende:
SELECT TeacherName FROM Teachers
EXCEPT
SELECT StudentName FROM Students;
Resultat:
teachername ------------- Cathy Ben
Så vi får kun værdier, der vises i Teachers
tabel, der ikke også vises i Students
bord.
Som standard er EXCEPT
operatør returnerer adskilte rækker. Så i vores eksempel returneres kun én række for Cathy
, selvom der er to lærere med det navn.
Ovenstående eksempel svarer til følgende forespørgsel:
SELECT TeacherName FROM Teachers
EXCEPT DISTINCT
SELECT StudentName FROM Students;
Resultat:
teachername ------------- Cathy Ben
Dette er det samme resultat, som vi fik, da der ikke var nogen eksplicit DISTINCT
søgeord. Vi kan inkludere dubletter med ALL
søgeord (mere om dette senere).
Vi kan få forskellige resultater, alt efter hvilken tabel der er til venstre og hvilken der er til højre. Her er et eksempel, der sætter Students
tabel til venstre og Teachers
til højre:
SELECT StudentName FROM Students
EXCEPT
SELECT TeacherName FROM Teachers;
Resultat:
studentname ------------- Faye Jet Spike Ein
Denne gang får vi elever, der ikke også er lærere.
Medtag dubletter
Som standard er EXCEPT
operatør anvender implicit en DISTINCT
operation. Med andre ord returnerer det kun distinkte værdier som standard.
Vi kan inkludere ALL
søgeord for at inkludere dubletter i vores resultat:
SELECT TeacherName FROM Teachers
EXCEPT ALL
SELECT StudentName FROM Students;
Resultat:
teachername ------------- Cathy Cathy Bill Ben
Denne gang fik vi fire rækker i stedet for de to, som vi fik i vores første eksempel.
Vi kan se, at begge Cathys blev returneret i stedet for blot én som i vores første eksempel.
Hvad angår Bill? Der er to regninger i Teachers
bord, men kun én returneres her. Det er sandsynligvis, fordi der er én regning i Students
tabel, hvilket ville udelukke et af lovforslagene fra vores resultater.
Et alternativ
Det er muligt at få det samme resultat uden at bruge EXCEPT
operatør. For eksempel kunne vi omskrive vores første eksempel til dette:
SELECT
DISTINCT TeacherName
FROM Teachers t
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName);
Resultat:
teachername ------------- Cathy Ben