PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como o INTERSECT funciona no PostgreSQL


No PostgreSQL, o INTERSECT O operador combina duas consultas, mas retorna apenas as linhas que são retornadas em ambas as consultas.

Sintaxe


A sintaxe fica assim:
query1 INTERSECT [ALL] query2

As duplicatas são eliminadas a menos que INTERSECT ALL é usado.

Exemplo


Suponha que temos as seguintes tabelas:
SELECT * FROM Employees;
SELECT * FROM Customers;

Resultado:
 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

Podemos usar o INTERSECT operador para devolver funcionários que também são clientes:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;

Resultado:
 employeename 
--------------
 Ava
 Rohit
 Monish

Assim, só obtemos valores que aparecem no campo Employees tabela que também aparecem no Customers tabela.

Por padrão, ele retorna linhas distintas, portanto, apenas uma linha é retornada para Monish, mesmo que haja vários funcionários e vários clientes com esse nome.

É o mesmo que fazer isso:
SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers;

Resultado:
 employeename 
--------------
 Ava
 Rohit
 Monish

Assim, obtemos o mesmo resultado obtido quando não incluímos o DISTINCT operador.

Incluir duplicatas


Como mencionado, o INTERSECT operador retorna apenas valores distintos por padrão. Mas podemos adicionar o ALL palavra-chave para incluir duplicatas:
SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers;

Resultado:
 employeename 
--------------
 Ava
 Rohit
 Monish
 Monish

Desta vez, obtivemos quatro linhas, em vez das três que obtivemos em nosso primeiro exemplo.

Podemos ver que duas linhas contendo o nome Monish foram retornadas ao invés de apenas uma como no nosso primeiro exemplo. Na verdade, existem três clientes chamados Monish, mas apenas dois funcionários com esse nome. Portanto, a operação cruza apenas dois deles.

Uma consulta alternativa


É possível obter o mesmo resultado sem usar o INTERSECT operador. Por exemplo, poderíamos reescrever nosso primeiro exemplo para isso:
SELECT 
    DISTINCT EmployeeName
FROM Employees e
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName);

Resultado:
 employeename 
--------------
 Ava
 Rohit
 Monish