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.