No SQLite, o
EXCEPT pode ser usado para criar um composto SELECT instrução que retorna o subconjunto de linhas retornado pelo SELECT esquerdo que não são retornados pelo SELECT correto . Exemplo
Suponha que temos as seguintes tabelas:
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 o
EXCEPT operador para devolver professores que não são também alunos:SELECT TeacherName FROM Teachers
EXCEPT
SELECT StudentName FROM Students; Resultado:
TeacherName ----------- Ben Cathy
Portanto, só obtemos valores que aparecem no
Teachers tabela que também não aparece em Students tabela. Podemos obter resultados diferentes, dependendo de qual tabela está à esquerda e qual está à direita. Aqui está um exemplo que coloca o
Students tabela à esquerda e Teachers a direita:SELECT StudentName FROM Students
EXCEPT
SELECT TeacherName FROM Teachers; Resultado:
StudentName ----------- Ein Faye Jet Spike
Desta vez, temos alunos que também não são professores.
EXCEPT do SQLite operador retorna apenas linhas distintas. Portanto, em nosso exemplo, apenas uma linha é retornada para Cathy , embora existam dois professores com esse nome. Alguns outros RDBMSs nos permitem incluir duplicatas no resultado aceitando um opcional
ALL palavra-chave com seu EXCEPT operador, mas o SQLite não (pelo menos, não no momento da escrita). Sinta-se à vontade para verificar a documentação do SQLite caso algo mude. Uma alternativa
É possível obter o mesmo resultado sem usar o
EXCEPT operador. Por exemplo, poderíamos reescrever nosso primeiro exemplo para isso:SELECT
DISTINCT TeacherName
FROM Teachers t
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName); Resultado:
TeacherName ----------- Ben Cathy