W SQLite EXCEPT operator może być użyty do utworzenia złożonego SELECT instrukcja zwracająca podzbiór wierszy zwracanych przez lewy SELECT które nie są zwracane przez właściwy SELECT .
Przykład
Załóżmy, że mamy następujące tabele:
SELECT * FROM Teachers;
SELECT * FROM Students; Wynik:
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
Możemy użyć EXCEPT operator zwracający nauczycieli, którzy nie są jednocześnie uczniami:
SELECT TeacherName FROM Teachers
EXCEPT
SELECT StudentName FROM Students; Wynik:
TeacherName ----------- Ben Cathy
Tak więc otrzymujemy tylko wartości, które pojawiają się w Teachers tabela, która nie pojawia się również w Students stół.
W zależności od tego, który stół jest po lewej, a który po prawej, możemy uzyskać różne wyniki. Oto przykład, który umieszcza Students tabela po lewej i Teachers po prawej:
SELECT StudentName FROM Students
EXCEPT
SELECT TeacherName FROM Teachers; Wynik:
StudentName ----------- Ein Faye Jet Spike
Tym razem mamy uczniów, którzy nie są jednocześnie nauczycielami.
EXCEPT SQLite operator zwraca tylko różne wiersze. Tak więc w naszym przykładzie dla Cathy zwracany jest tylko jeden wiersz , mimo że jest dwóch nauczycieli o tym nazwisku.
Niektóre inne RDBMS pozwalają nam na uwzględnienie duplikatów w wyniku poprzez zaakceptowanie opcjonalnego ALL słowo kluczowe z ich EXCEPT operatora, ale SQLite tego nie robi (przynajmniej nie w momencie pisania). Zachęcamy do zapoznania się z dokumentacją SQLite na wypadek jakichkolwiek zmian.
Alternatywna
Możliwe jest uzyskanie tego samego wyniku bez użycia EXCEPT operator. Na przykład moglibyśmy przepisać nasz pierwszy przykład do tego:
SELECT
DISTINCT TeacherName
FROM Teachers t
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName); Wynik:
TeacherName ----------- Ben Cathy