I PostgreSQL er INTERSECT
operator kombinerer to forespørgsler, men returnerer kun de rækker, der returneres i begge forespørgsler.
Syntaks
Syntaksen ser sådan ud:
query1 INTERSECT [ALL] query2
Dubletter elimineres, medmindre INTERSECT ALL
bruges.
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 customerid | 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 Rohit Monish
Så vi får kun værdier, der vises i Employees
tabel, der også vises i Customers
bord.
Som standard returnerer den adskilte rækker, så kun én række returneres for Monish, selvom der er flere ansatte og flere kunder med det navn.
Det er det samme som at gøre dette:
SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers;
Resultat:
employeename -------------- Ava Rohit Monish
Så vi får det samme resultat, som vi fik, da vi ikke inkluderede DISTINCT
operatør.
Medtag dubletter
Som nævnt er INTERSECT
operatør returnerer kun distinkte værdier som standard. Men vi kan tilføje ALL
søgeord for at inkludere dubletter:
SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers;
Resultat:
employeename -------------- Ava Rohit Monish Monish
Denne gang fik vi fire rækker i stedet for de tre, som vi fik i vores første eksempel.
Vi kan se, at to rækker med navnet Monish blev returneret i stedet for blot én som i vores første eksempel. Der er faktisk tre kunder, der hedder Monish, men kun to medarbejdere med det navn. Derfor skærer operationen kun to af dem.
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 -------------- Ava Rohit Monish