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.