PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как работи INTERSECT в PostgreSQL

В 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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. HikariCP Postgresql Driver твърди, че не приема JDBC URL

  2. Разгръщане на клъстер в множество облаци на PostgreSQL

  3. Rails и PostgreSQL:Ролята postgres не съществува

  4. Можете ли да създадете индекс в дефиницията CREATE TABLE?

  5. Как да деактивирам временно тригерите в PostgreSQL?