I Oracle Database, INTERSECT
operatorn används för att skapa en sammansatt fråga som returnerar skärningspunkten mellan resultaten av vänster och höger SELECT
uttalanden. Med andra ord, den kombinerar två frågor, men returnerar bara de rader som returneras i båda frågorna.
Exempel
Anta att vi har följande tabeller:
SELECT * FROM Employees;
SELECT * FROM Customers;
Resultat:
ANSTÄLLDA ID | EMPLOYEENAME |
---|---|
1 | Bart |
2 | Jan |
3 | Ava |
4 | Rohit |
5 | Monish |
6 | Monish |
7 | Monish |
KUNDID | CUSTOMERNAME |
---|---|
1 | Mia |
2 | Rohit |
3 | Peter |
4 | Ava |
5 | Monish |
6 | Monish |
Vi kan använda INTERSECT
operatör att returnera anställda som också är kunder:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;
Resultat:
EMPLOYEENAME |
---|
Ava |
Monish |
Rohit |
Så det returnerar bara de värden som visas i båda Employees
tabellen och Customers
tabell.
Oracle Database implementering av INTERSECT
operatören returnerar endast distinkta rader. Vi kan se detta i exemplet ovan. Den returnerar bara en rad för Monish, även om det finns flera anställda och flera kunder med det namnet.
Vissa RDBMS tillåter oss att inkludera dubbletter i resultatet genom att acceptera en valfri ALL
nyckelord med INTERSECT
operatör, men Oracle är inte en av dem (åtminstone inte i skrivande stund). Inte heller SQLite.
En alternativ fråga
Det är möjligt att få samma resultat utan att använda INTERSECT
operatör. Till exempel skulle vi kunna skriva om vårt första exempel till detta:
SELECT
DISTINCT EmployeeName
FROM Employees e
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName);
Resultat:
EMPLOYEENAME |
---|
Rohit |
Ava |
Monish |
Några saker att komma ihåg
Observera att uttrycken måste matcha i antal och måste vara i samma datatypgrupp. Därför kan vi inte göra följande:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerId, CustomerName FROM Customers;
Resultat:
ORA-01789: query block has incorrect number of result columns
Eller det här:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerId FROM Customers;
Resultat:
ORA-01790: expression must have same datatype as corresponding expression
Även om vi kan använda funktioner som TO_CHAR()
för att konvertera en kolumn till en lämplig datatypgrupp:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT TO_CHAR(CustomerId) FROM Customers;
Resultat:
no data found
I det här fallet hittades ingen data eftersom ingen av CustomerId
värden matchade någon av EmployeeName
värden. Men om de gjorde det skulle vi se matcherna.