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

Oracle INTERSECT Operator forklaret

I Oracle Database er INTERSECT operator bruges til at oprette en sammensat forespørgsel, der returnerer skæringspunktet mellem resultaterne af venstre og højre SELECT udsagn. Med andre ord kombinerer den to forespørgsler, men returnerer kun de rækker, der returneres i begge forespørgsler.

Eksempel

Antag, at vi har følgende tabeller:

SELECT * FROM Employees;
SELECT * FROM Customers;

Resultat:

EMPLOYEEID EMPLOYEENAME
1 Bart
2 Jan
3 Ava
4 Rohit
5 Monish
6 Monish
7 Monish
KUNDE-ID CUSTOMERNAME
1 Mia
2 Rohit
3 Peter
4 Ava
5 Monish
6 Monish

Vi kan bruge INTERSECT operatør til at returnere medarbejdere, der også er kunder:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;

Resultat:

EMPLOYEENAME
Ava
Monish
Rohit

Så det returnerer kun de værdier, der vises i både Employees tabellen og Customers bord.

Oracle Databases implementering af INTERSECT operatør returnerer kun distinkte rækker. Det kan vi se i ovenstående eksempel. Det returnerer kun én række for Monish, selvom der er flere ansatte og flere kunder med det navn.

Nogle RDBMS'er tillader os at inkludere dubletter i resultatet ved at acceptere en valgfri ALL søgeord med INTERSECT operatør, men Oracle er ikke en af ​​dem (i hvert fald ikke i skrivende stund). Det er SQLite heller ikke.

En alternativ forespørgsel

Det er muligt at få det samme resultat uden at bruge INTERSECT operatør. For eksempel kunne vi omskrive vores første eksempel til dette:

SELECT 
    DISTINCT EmployeeName
FROM Employees e
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName);

Resultat:

EMPLOYEENAME
Rohit
Ava
Monish

Nogle ting at huske

Bemærk, at udtrykkene skal matche i antal og skal være i samme datatypegruppe. Derfor kan vi ikke gøre følgende:

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

Resultat:

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

Eller denne:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerId FROM Customers;

Resultat:

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

Selvom vi kan bruge funktioner som TO_CHAR() for at konvertere en kolonne til en passende datatypegruppe:

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

Resultat:

no data found

I dette tilfælde blev der ikke fundet nogen data, fordi ingen af ​​CustomerId værdier matchede enhver af EmployeeName værdier. Men hvis de gjorde det, så ville vi se kampene.


  1. Oracle til PostgreSQL:ANSI ydre joinsyntaks i PostgreSQL

  2. Konfiguration af et dedikeret netværk til tilgængelighedsgruppekommunikation

  3. Clustered og Non Clustered Index:7 Top Points Forklaret

  4. JSON-funktioner og -operatører i SQLite (fuld liste)