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