sql >> Databasteknik >  >> RDS >> Oracle

Oracle INTERSECT Operator förklaras

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.


  1. Alternativ lösning till DCount och DLookup med MS SQL Server Backend

  2. Diagnostisera dödlägen i SQL Server 2005

  3. Infogar preparerat statement till databasen - PSQL

  4. Hur man använder NVL()-funktionen i Oracle