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