Dans PostgreSQL, le EXCEPT
L'opérateur renvoie les lignes renvoyées par la requête d'entrée de gauche qui ne sont pas renvoyées par la requête d'entrée de droite. Cela peut également être appelé la différence entre deux requêtes.
Syntaxe
La syntaxe ressemble à ceci :
query1 EXCEPT [ALL] query2
Les doublons sont éliminés sauf si EXCEPT ALL
est utilisé.
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 ------------- Cathy Ben
Nous n'obtenons donc que les valeurs qui apparaissent dans le Teachers
tableau qui n'apparaissent pas également dans le Students
table.
Par défaut, le EXCEPT
L'opérateur renvoie 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.
L'exemple ci-dessus est l'équivalent de la requête suivante :
SELECT TeacherName FROM Teachers
EXCEPT DISTINCT
SELECT StudentName FROM Students;
Résultat :
teachername ------------- Cathy Ben
C'est le même résultat que nous avons obtenu lorsqu'il n'y avait pas de DISTINCT
explicite mot-clé. Nous pouvons inclure des doublons avec le ALL
mot-clé (plus à ce sujet plus tard).
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 ------------- Faye Jet Spike Ein
Cette fois, nous obtenons des étudiants qui ne sont pas aussi des enseignants.
Inclure les doublons
Par défaut, le EXCEPT
l'opérateur applique implicitement un DISTINCT
opération. En d'autres termes, il ne renvoie que des valeurs distinctes par défaut.
Nous pouvons inclure le ALL
mot-clé afin d'inclure les doublons dans notre résultat :
SELECT TeacherName FROM Teachers
EXCEPT ALL
SELECT StudentName FROM Students;
Résultat :
teachername ------------- Cathy Cathy Bill Ben
Cette fois, nous avons quatre lignes, au lieu des deux que nous avions dans notre premier exemple.
Nous pouvons voir que les deux Cathy ont été renvoyées au lieu d'une seule comme dans notre premier exemple.
Quant à Bill ? Il y a deux projets de loi dans les Teachers
table, mais un seul est retourné ici. C'est probablement parce qu'il y a un projet de loi dans les Students
tableau, ce qui exclurait l'un des projets de loi de nos résultats.
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 ------------- Cathy Ben