Oracle
 sql >> Database >  >> RDS >> Oracle

Spiegazione dell'operatore Oracle INTERSECT

In Oracle Database, il INTERSECT viene utilizzato per creare una query composta che restituisce l'intersezione dei risultati del SELECT sinistro e destro dichiarazioni. In altre parole, combina due query, ma restituisce solo le righe restituite in entrambe le query.

Esempio

Supponiamo di avere le seguenti tabelle:

SELECT * FROM Employees;
SELECT * FROM Customers;

Risultato:

ID DIPENDENTE NOME DIPENDENTE
1 Bart
2 gennaio
3 Ava
4 Rohit
5 Monish
6 Monish
7 Monish
CUSTOMERID NOME CLIENTE
1 Mia
2 Rohit
3 Pietro
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:

DIPENDENTE
Ava
Monish
Rohit

Quindi restituisce solo quei valori che appaiono in entrambi i Employees tabella e il Customers tavolo.

Implementazione di Oracle Database di INTERSECT l'operatore restituisce solo righe distinte. Possiamo vederlo nell'esempio sopra. Restituisce solo una riga per Monish, anche se ci sono più dipendenti e più clienti con quel nome.

Alcuni RDBMS ci consentono di includere duplicati nel risultato accettando un ALL opzionale parola chiave con il INTERSECT operatore, ma Oracle non è uno di questi (almeno, non al momento della scrittura). Nemmeno SQLite.

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:

DIPENDENTE
Rohit
Ava
Monish

Alcune cose da ricordare

Si noti che le espressioni devono corrispondere in numero e devono trovarsi nello stesso gruppo di tipi di dati. Pertanto, non possiamo fare quanto segue:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerId, CustomerName FROM Customers;

Risultato:

ORA-01789: query block has incorrect number of result columns

O questo:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerId FROM Customers;

Risultato:

ORA-01790: expression must have same datatype as corresponding expression

Tuttavia, possiamo usare funzioni come TO_CHAR() per convertire una colonna in un gruppo di tipi di dati adatto:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT TO_CHAR(CustomerId) FROM Customers;

Risultato:

no data found

In questo caso, nessun dato è stato trovato perché nessuno dei CustomerId i valori corrispondevano a uno qualsiasi dei EmployeeName valori. Ma se lo facessero, vedremmo le partite.