I SQLite er EXCEPT
operator kan bruges til at oprette en sammensat SELECT
sætning, der returnerer delmængden af rækker, der returneres af den venstre SELECT
som ikke returneres af den rigtige SELECT
.
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 ----------- Ben Cathy
Så vi får kun værdier, der vises i Teachers
tabel, der ikke også vises i Students
bord.
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 ----------- Ein Faye Jet Spike
Denne gang får vi elever, der ikke også er lærere.
SQLites EXCEPT
operatør returnerer kun distinkte rækker. Så i vores eksempel returneres kun én række for Cathy
, selvom der er to lærere med det navn.
Nogle andre RDBMS'er tillader os at inkludere dubletter i resultatet ved at acceptere en valgfri ALL
søgeord med deres EXCEPT
operatør, men det gør SQLite ikke (i hvert fald ikke i skrivende stund). Du er velkommen til at tjekke SQLites dokumentation, hvis noget ændrer sig.
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 ----------- Ben Cathy