SQLite
 sql >> Base de Dados >  >> RDS >> SQLite

Operador SQLite EXCEPT


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