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