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.