I PostgreSQL, INTERSECT operatorn kombinerar två frågor, men returnerar endast de rader som returneras i båda frågorna.
Syntax
Syntaxen ser ut så här:
query1 INTERSECT [ALL] query2
Dubbletter elimineras såvida inte INTERSECT ALL används.
Exempel
Anta att vi har följande 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 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 Rohit Monish
Så vi får bara värden som visas i Employees tabell som också visas i Customers tabell.
Som standard returnerar den distinkta rader, så endast en rad returneras för Monish, även om det finns flera anställda och flera kunder med det namnet.
Det är samma sak som att göra det här:
SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers; Resultat:
employeename -------------- Ava Rohit Monish
Så vi får samma resultat som vi fick när vi inte inkluderade DISTINCT operatör.
Inkludera dubbletter
Som nämnts, INTERSECT operatören returnerar endast distinkta värden som standard. Men vi kan lägga till ALL nyckelord för att inkludera dubbletter:
SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers; Resultat:
employeename -------------- Ava Rohit Monish Monish
Den här gången fick vi fyra rader, istället för de tre som vi fick i vårt första exempel.
Vi kan se att två rader som innehåller namnet Monish returnerades istället för bara en som i vårt första exempel. Det finns faktiskt tre kunder som heter Monish, men bara två anställda med det namnet. Därför skär operationen bara två av dem.
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 -------------- Ava Rohit Monish