sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo funciona INTERSECT en PostgreSQL

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