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

Cómo funciona EXCEPTO en PostgreSQL

En PostgreSQL, el EXCEPT El operador devuelve filas que devuelve la consulta de entrada izquierda que no devuelve la consulta de entrada derecha. Esto también se puede denominar la diferencia entre dos consultas.

Sintaxis

La sintaxis es así:

query1 EXCEPT [ALL] query2

Los duplicados se eliminan a menos que EXCEPT ALL se utiliza.

Ejemplo

Supongamos que tenemos las siguientes tablas:

SELECT * FROM Teachers;
SELECT * FROM Students;

Resultado:

 teacherid | teachername 
-----------+-------------
         1 | Warren
         2 | Ben
         3 | Cathy
         4 | Cathy
         5 | Bill
         6 | Bill

 studentid | studentname 
-----------+-------------
         1 | Faye
         2 | Jet
         3 | Spike
         4 | Ein
         5 | Warren
         6 | Bill

Podemos usar el EXCEPT operador para devolver profesores que no son también estudiantes:

SELECT TeacherName FROM Teachers
EXCEPT
SELECT StudentName FROM Students;

Resultado:

 teachername 
-------------
 Cathy
 Ben

Entonces solo obtenemos valores que aparecen en Teachers que no aparecen en la tabla Students mesa.

Por defecto, el EXCEPT operador devuelve filas distintas. Entonces, en nuestro ejemplo, solo se devuelve una fila para Cathy , a pesar de que hay dos profesores con ese nombre.

El ejemplo anterior es el equivalente de la siguiente consulta:

SELECT TeacherName FROM Teachers
EXCEPT DISTINCT
SELECT StudentName FROM Students;

Resultado:

 teachername 
-------------
 Cathy
 Ben

Este es el mismo resultado que obtuvimos cuando no había DISTINCT explícito palabra clave. Podemos incluir duplicados con ALL palabra clave (más sobre esto más adelante).

Podemos obtener diferentes resultados, dependiendo de qué tabla está a la izquierda y cuál a la derecha. Aquí hay un ejemplo que pone a los Students mesa a la izquierda y Teachers a la derecha:

SELECT StudentName FROM Students
EXCEPT
SELECT TeacherName FROM Teachers;

Resultado:

 studentname 
-------------
 Faye
 Jet
 Spike
 Ein

Esta vez tenemos estudiantes que no son también profesores.

Incluir duplicados

Por defecto, el EXCEPT operador aplica implícitamente un DISTINCT operación. En otras palabras, devuelve solo valores distintos de forma predeterminada.

Podemos incluir los ALL palabra clave para incluir duplicados en nuestro resultado:

SELECT TeacherName FROM Teachers
EXCEPT ALL
SELECT StudentName FROM Students;

Resultado:

 teachername 
-------------
 Cathy
 Cathy
 Bill
 Ben

Esta vez obtuvimos cuatro filas, en lugar de las dos que obtuvimos en nuestro primer ejemplo.

Podemos ver que ambos Cathys fueron devueltos en lugar de solo uno como en nuestro primer ejemplo.

¿En cuanto a Bill? Hay dos proyectos de ley en los Teachers table, pero aquí solo se devuelve uno. Probablemente se deba a que hay un proyecto de ley en Students tabla, lo que excluiría uno de los proyectos de ley de nuestros resultados.

Una Alternativa

Es posible obtener el mismo resultado sin usar EXCEPT operador. Por ejemplo, podríamos reescribir nuestro primer ejemplo así:

SELECT 
    DISTINCT TeacherName
FROM Teachers t 
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName);

Resultado:

 teachername 
-------------
 Cathy
 Ben