Dans SQLite, le EXCEPT
L'opérateur peut être utilisé pour créer un composé SELECT
instruction qui renvoie le sous-ensemble de lignes renvoyé par le SELECT
de gauche qui ne sont pas retournés par le bon SELECT
.
Exemple
Supposons que nous ayons les tables suivantes :
SELECT * FROM Teachers;
SELECT * FROM Students;
Résultat :
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
Nous pouvons utiliser le EXCEPT
opérateur pour renvoyer les enseignants qui ne sont pas également des étudiants :
SELECT TeacherName FROM Teachers
EXCEPT
SELECT StudentName FROM Students;
Résultat :
TeacherName ----------- Ben Cathy
Nous n'obtenons donc que les valeurs qui apparaissent dans le Teachers
tableau qui n'apparaissent pas également dans le Students
table.
Nous pouvons obtenir des résultats différents, selon la table qui se trouve à gauche et celle qui se trouve à droite. Voici un exemple qui met les Students
table à gauche et Teachers
à droite :
SELECT StudentName FROM Students
EXCEPT
SELECT TeacherName FROM Teachers;
Résultat :
StudentName ----------- Ein Faye Jet Spike
Cette fois, nous obtenons des étudiants qui ne sont pas aussi des enseignants.
EXCEPT
de SQLite L'opérateur renvoie uniquement des lignes distinctes. Ainsi, dans notre exemple, une seule ligne est renvoyée pour Cathy
, même s'il y a deux professeurs portant ce nom.
Certains autres SGBDR nous permettent d'inclure des doublons dans le résultat en acceptant un ALL
facultatif mot-clé avec leur EXCEPT
opérateur, mais pas SQLite (du moins, pas au moment de la rédaction). N'hésitez pas à consulter la documentation de SQLite au cas où quelque chose changerait.
Une alternative
Il est possible d'obtenir le même résultat sans utiliser le EXCEPT
opérateur. Par exemple, nous pourrions réécrire notre premier exemple en ceci :
SELECT
DISTINCT TeacherName
FROM Teachers t
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName);
Résultat :
TeacherName ----------- Ben Cathy