PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment EXCEPT fonctionne dans PostgreSQL

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