В PostgreSQL, INTERSECT
оператор комбинира две заявки, но връща само онези редове, които са върнати и в двете заявки.
Синтаксис
Синтаксисът е така:
query1 INTERSECT [ALL] query2
Дубликатите се елиминират, освен ако INTERSECT ALL
се използва.
Пример
Да предположим, че имаме следните таблици:
SELECT * FROM Employees;
SELECT * FROM Customers;
Резултат:
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
Можем да използваме INTERSECT
оператор да върне служители, които също са клиенти:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;
Резултат:
employeename -------------- Ava Rohit Monish
Така че получаваме само стойности, които се появяват в Employees
таблица, която също се появява в Customers
маса.
По подразбиране той връща отделни редове, така че само един ред се връща за Monish, въпреки че има множество служители и множество клиенти с това име.
Това е същото като да направите това:
SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers;
Резултат:
employeename -------------- Ava Rohit Monish
Така получаваме същия резултат, който получихме, когато не включихме DISTINCT
оператор.
Включване на дубликати
Както споменахме, INTERSECT
операторът връща само различни стойности по подразбиране. Но можем да добавим ALL
ключова дума да включва дубликати:
SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers;
Резултат:
employeename -------------- Ava Rohit Monish Monish
Този път получихме четири реда, вместо трите, които получихме в първия ни пример.
Можем да видим, че два реда, съдържащи името Monish, бяха върнати вместо само един, както в нашия първи пример. Всъщност има трима клиенти, наречени Monish, но само двама служители с това име. Следователно операцията пресича само две от тях.
Алтернативна заявка
Възможно е да получите същия резултат, без да използвате INTERSECT
оператор. Например, можем да пренапишем първия си пример на това:
SELECT
DISTINCT EmployeeName
FROM Employees e
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName);
Резултат:
employeename -------------- Ava Rohit Monish