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