Réalisation de semi-jointures avec EXCEPT et INTERSECT
Une semi-jointure retourne des lignes de la première entrée s’il existe au moins une ligne correspondante dans la deuxième entrée. Une anti-jointure retourne des lignes de la première entrée s’il n’existe aucune ligne correspondante dans la deuxième entrée. Les semi-jointures et les anti-jointures s’effectuent à l’aide des opérateurs EXCEPT et INTERSECT. Ces opérateurs vous permettent de comparer les résultats d'au moins deux instructions SELECT et de retourner des valeurs distinctes. L'opérateur EXCEPT retourne toute valeur distincte provenant de la requête du côté gauche de l'opérateur EXCEPT qui n'est pas également retournée par la requête du côté droit. INTERSECT retourne toute valeur distincte retournée par la requête à la fois des côtés gauche et droit de l'opérateur INTERSECT. Les ensembles de résultats comparés à l'aide d'EXCEPT ou d'INTERSECT doivent tous posséder la même structure. Ils doivent posséder le même nombre de colonnes et les types de données des colonnes correspondantes de l'ensemble de résultats doivent être compatibles. Pour plus d'informations, consultez EXCEPT et INTERSECT (Transact-SQL).
Prenons l'exemple des tables TableA, TableB et TableC contenant les données suivantes dans leur colonne col1int respective.
TableA (col1 int) |
TableB (col1 int) |
TableC (col1 int) |
---|---|---|
NULL |
NULL |
2 |
NULL |
1 |
2 |
NULL |
3 |
2 |
1 |
4 |
4 |
2 |
4 |
4 |
2 |
||
2 |
||
3 |
||
4 |
||
4 |
À l'aide d'EXCEPT, la requête suivante retourne toute valeur distincte provenant de la requête du côté gauche de l'opérande EXCEPT qui ne se trouve pas également dans la requête de droite.
SELECT * FROM TableA EXCEPT SELECT * FROM TableB
Voici l'ensemble des résultats.
Col1
-----------
2
(1 row(s) affected)
À l'aide d'INTERSECT, cette requête retourne toute valeur distincte retournée par la requête à la fois des côtés gauche et droit de l'opérateur INTERSECT.
SELECT * FROM TableA INTERSECT SELECT * FROM TableB
Voici l'ensemble des résultats.
Col1
-----------
NULL
1
3
4
(4 row(s) affected)
L'opérateur INTERSECT prévaut sur EXCEPT. Par exemple, la requête suivante utilise les deux opérateurs :
SELECT * FROM TableA EXCEPT SELECT * FROM TableB INTERSECT SELECT * FROM TableC
Voici l'ensemble des résultats.
Col1
-----------
NULL
1
2
3
(4 row(s) affected)