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