In PostgreSQL, il INTERSECT
combina due query, ma restituisce solo le righe restituite in entrambe le query.
Sintassi
La sintassi è questa:
query1 INTERSECT [ALL] query2
I duplicati vengono eliminati a meno che INTERSECT ALL
viene utilizzato.
Esempio
Supponiamo di avere le seguenti tabelle:
SELECT * FROM Employees;
SELECT * FROM Customers;
Risultato:
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
Possiamo usare il INTERSECT
operatore per restituire i dipendenti che sono anche clienti:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;
Risultato:
employeename -------------- Ava Rohit Monish
Quindi otteniamo solo i valori che appaiono in Employees
tabella che compare anche in Customers
tavolo.
Per impostazione predefinita, restituisce righe distinte, quindi viene restituita solo una riga per Monish, anche se sono presenti più dipendenti e più clienti con quel nome.
È come fare questo:
SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers;
Risultato:
employeename -------------- Ava Rohit Monish
Quindi otteniamo lo stesso risultato che abbiamo ottenuto quando non abbiamo incluso il DISTINCT
operatore.
Includi duplicati
Come accennato, il INTERSECT
l'operatore restituisce solo valori distinti per impostazione predefinita. Ma possiamo aggiungere il ALL
parola chiave per includere i duplicati:
SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers;
Risultato:
employeename -------------- Ava Rohit Monish Monish
Questa volta abbiamo ottenuto quattro righe, invece delle tre che abbiamo ottenuto nel nostro primo esempio.
Possiamo vedere che sono state restituite due righe contenenti il nome Monish invece di una sola come nel nostro primo esempio. In realtà ci sono tre clienti chiamati Monish, ma solo due dipendenti con quel nome. Pertanto, l'operazione ne interseca solo due.
Una query alternativa
È possibile ottenere lo stesso risultato senza utilizzare il INTERSECT
operatore. Ad esempio, potremmo riscrivere il nostro primo esempio in questo:
SELECT
DISTINCT EmployeeName
FROM Employees e
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName);
Risultato:
employeename -------------- Ava Rohit Monish