sql >> Base de Datos >  >> RDS >> SQLite

Operador EXCEPT de SQLite

En SQLite, el EXCEPT El operador se puede usar para crear un compuesto SELECT instrucción que devuelve el subconjunto de filas devueltas por el SELECT izquierdo que no son devueltos por la derecha SELECT .

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
-----------
Ben        
Cathy      

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

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
-----------
Ein        
Faye       
Jet        
Spike      

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

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

Algunos otros RDBMS nos permiten incluir duplicados en el resultado al aceptar un ALL opcional. palabra clave con su EXCEPT operador, pero SQLite no (al menos, no en el momento de escribir este artículo). No dude en consultar la documentación de SQLite en caso de que algo cambie.

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
-----------
Ben        
Cathy