I SQLite, EXCEPT operatorn kan användas för att skapa en sammansatt SELECT sats som returnerar delmängden av rader som returneras av den vänstra SELECT som inte returneras av rätt SELECT .
Exempel
Anta att vi har följande 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 använda EXCEPT operatör för att returnera lärare som inte också är elever:
SELECT TeacherName FROM Teachers
EXCEPT
SELECT StudentName FROM Students; Resultat:
TeacherName ----------- Ben Cathy
Så vi får bara värden som visas i Teachers tabell som inte också visas i Students tabell.
Vi kan få olika resultat, beroende på vilken tabell som är till vänster och vilken som är till höger. Här är ett exempel som sätter Students tabellen till vänster och Teachers till höger:
SELECT StudentName FROM Students
EXCEPT
SELECT TeacherName FROM Teachers; Resultat:
StudentName ----------- Ein Faye Jet Spike
Den här gången får vi elever som inte också är lärare.
SQLites EXCEPT operatören returnerar endast distinkta rader. Så i vårt exempel returneras bara en rad för Cathy , även om det finns två lärare med det namnet.
Vissa andra RDBMS tillåter oss att inkludera dubbletter i resultatet genom att acceptera en valfri ALL sökord med deras EXCEPT operatör, men det gör inte SQLite (åtminstone inte i skrivande stund). Kolla gärna SQLites dokumentation om något ändras.
Ett alternativ
Det är möjligt att få samma resultat utan att använda EXCEPT operatör. Till exempel skulle vi kunna skriva om vårt första exempel till detta:
SELECT
DISTINCT TeacherName
FROM Teachers t
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName); Resultat:
TeacherName ----------- Ben Cathy