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