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