En PostgreSQL, el INTERSECT
El operador combina dos consultas, pero devuelve solo las filas que se devuelven en ambas consultas.
Sintaxis
La sintaxis es así:
query1 INTERSECT [ALL] query2
Los duplicados se eliminan a menos que INTERSECT ALL
se utiliza.
Ejemplo
Supongamos que tenemos las siguientes tablas:
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 el INTERSECT
operador para devolver empleados que también son clientes:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;
Resultado:
employeename -------------- Ava Rohit Monish
Entonces solo obtenemos valores que aparecen en Employees
que también aparecen en la tabla Customers
mesa.
De forma predeterminada, devuelve filas distintas, por lo que solo se devuelve una fila para Monish, aunque haya varios empleados y varios clientes con ese nombre.
Es lo mismo que hacer esto:
SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers;
Resultado:
employeename -------------- Ava Rohit Monish
Entonces obtenemos el mismo resultado que obtuvimos cuando no incluimos el DISTINCT
operador.
Incluir duplicados
Como se mencionó, el INTERSECT
El operador devuelve solo valores distintos de forma predeterminada. Pero podemos agregar el ALL
palabra clave para incluir duplicados:
SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers;
Resultado:
employeename -------------- Ava Rohit Monish Monish
Esta vez obtuvimos cuatro filas, en lugar de las tres que obtuvimos en nuestro primer ejemplo.
Podemos ver que se devolvieron dos filas que contenían el nombre Monish en lugar de solo una como en nuestro primer ejemplo. En realidad, hay tres clientes llamados Monish, pero solo dos empleados con ese nombre. Por lo tanto, la operación solo intersecta dos de ellos.
Una consulta alternativa
Es posible obtener el mismo resultado sin utilizar INTERSECT
operador. Por ejemplo, podríamos reescribir nuestro primer ejemplo así:
SELECT
DISTINCT EmployeeName
FROM Employees e
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName);
Resultado:
employeename -------------- Ava Rohit Monish