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