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