W PostgreSQL EXCEPT operator zwraca wiersze zwracane przez lewe zapytanie wejściowe, które nie są zwracane przez prawe zapytanie wejściowe. Można to również nazwać różnicą między dwoma zapytaniami.
Składnia
Składnia wygląda tak:
query1 EXCEPT [ALL] query2
Duplikaty są eliminowane, chyba że EXCEPT ALL jest używany.
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 ------------- Cathy Ben
Tak więc otrzymujemy tylko wartości, które pojawiają się w Teachers tabela, która nie pojawia się również w Students stół.
Domyślnie EXCEPT operator zwraca 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.
Powyższy przykład jest odpowiednikiem następującego zapytania:
SELECT TeacherName FROM Teachers
EXCEPT DISTINCT
SELECT StudentName FROM Students; Wynik:
teachername ------------- Cathy Ben
Jest to ten sam wynik, który otrzymaliśmy, gdy nie było wyraźnego DISTINCT słowo kluczowe. Możemy uwzględnić duplikaty za pomocą ALL słowo kluczowe (więcej na ten temat później).
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 ------------- Faye Jet Spike Ein
Tym razem mamy uczniów, którzy nie są jednocześnie nauczycielami.
Dołącz duplikaty
Domyślnie EXCEPT operator domyślnie stosuje DISTINCT operacja. Innymi słowy, domyślnie zwraca tylko różne wartości.
Możemy uwzględnić ALL słowo kluczowe, aby uwzględnić duplikaty w naszym wyniku:
SELECT TeacherName FROM Teachers
EXCEPT ALL
SELECT StudentName FROM Students; Wynik:
teachername ------------- Cathy Cathy Bill Ben
Tym razem otrzymaliśmy cztery wiersze, zamiast dwóch, które otrzymaliśmy w naszym pierwszym przykładzie.
Widzimy, że obie Cathys zostały zwrócone zamiast jednej, jak w naszym pierwszym przykładzie.
A co z Billem? W sekcji Teachers znajdują się dwa rachunki tabela, ale tutaj zwracana jest tylko jedna. To prawdopodobnie dlatego, że w grupie Students jest jeden rachunek tabeli, która wykluczałaby jeden z rachunków z naszych wyników.
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 ------------- Cathy Ben