In SQLite is de EXCEPT
operator kan worden gebruikt om een samengestelde SELECT
te maken instructie die de subset van rijen retourneert die worden geretourneerd door de linker SELECT
die niet worden geretourneerd door de juiste SELECT
.
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 ----------- Ben Cathy
We krijgen dus alleen waarden die voorkomen in de Teachers
tabel die niet ook voorkomt in de Students
tafel.
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 ----------- Ein Faye Jet Spike
Deze keer krijgen we leerlingen die niet ook leraar zijn.
SQLite's EXCEPT
operator retourneert alleen afzonderlijke rijen. Dus in ons voorbeeld wordt slechts één rij geretourneerd voor Cathy
, ook al zijn er twee leraren met die naam.
Sommige andere RDBMS'en stellen ons in staat om duplicaten in het resultaat op te nemen door een optionele ALL
. te accepteren trefwoord met hun EXCEPT
operator, maar SQLite niet (tenminste, niet op het moment van schrijven). Voel je vrij om de documentatie van SQLite te raadplegen voor het geval er iets verandert.
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 ----------- Ben Cathy