PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come funziona INTERSECT in PostgreSQL

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