W PostgreSQL INTERSECT
operator łączy dwa zapytania, ale zwraca tylko te wiersze, które są zwracane w obu zapytaniach.
Składnia
Składnia wygląda tak:
query1 INTERSECT [ALL] query2
Duplikaty są eliminowane, chyba że INTERSECT ALL
jest używany.
Przykład
Załóżmy, że mamy następujące tabele:
SELECT * FROM Employees;
SELECT * FROM Customers;
Wynik:
employeeid | employeename ------------+-------------- 1 | Bart 2 | Jan 3 | Ava 4 | Rohit 5 | Monish 6 | Monish 7 | Monish customerid | customername ------------+-------------- 1 | Mia 2 | Rohit 3 | Peter 4 | Ava 5 | Monish 6 | Monish
Możemy użyć INTERSECT
operator zwraca pracowników, którzy są również klientami:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;
Wynik:
employeename -------------- Ava Rohit Monish
Więc otrzymujemy tylko wartości, które pojawiają się w Employees
tabela, która pojawia się również w Customers
stół.
Domyślnie zwraca różne wiersze, więc dla Monish zwracany jest tylko jeden wiersz, mimo że istnieje wielu pracowników i wielu klientów o tej nazwie.
To tak samo, jak zrobienie tego:
SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers;
Wynik:
employeename -------------- Ava Rohit Monish
Otrzymujemy więc ten sam wynik, który otrzymaliśmy, gdy nie uwzględniliśmy DISTINCT
operatora.
Dołącz duplikaty
Jak wspomniano, INTERSECT
operator domyślnie zwraca tylko różne wartości. Ale możemy dodać ALL
słowo kluczowe do uwzględnienia duplikatów:
SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers;
Wynik:
employeename -------------- Ava Rohit Monish Monish
Tym razem otrzymaliśmy cztery wiersze, zamiast trzech, które otrzymaliśmy w naszym pierwszym przykładzie.
Widzimy, że zostały zwrócone dwa wiersze zawierające nazwę Monish zamiast jednego, jak w naszym pierwszym przykładzie. W rzeczywistości jest trzech klientów o nazwie Monish, ale tylko dwóch pracowników o tej nazwie. Dlatego operacja przecina tylko dwa z nich.
Alternatywne zapytanie
Możliwe jest uzyskanie tego samego wyniku bez użycia INTERSECT
operator. Na przykład moglibyśmy przepisać nasz pierwszy przykład do tego:
SELECT
DISTINCT EmployeeName
FROM Employees e
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName);
Wynik:
employeename -------------- Ava Rohit Monish