Sous-requêtes introduites par EXISTS
Une sous-requête introduite par le mot clé EXISTS constitue un test d'existence. La clause WHERE de la requête externe teste l'existence des lignes retournées par la sous-requête. En réalité, la sous-requête ne génère pas de données, elle retourne la valeur TRUE ou FALSE.
Une sous-requête introduite par EXISTS
présente la syntaxe suivante :
WHERE [NOT] EXISTS (subquery)
La requête suivante trouve les noms de tous les produits de la sous-catégorie Wheels
:
USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE EXISTS
(SELECT *
FROM Production.ProductSubcategory
WHERE ProductSubcategoryID =
Production.Product.ProductSubcategoryID
AND Name = 'Wheels')
Voici l'ensemble des résultats.
Name
--------------------------------------------------
LL Mountain Front Wheel
ML Mountain Front Wheel
HL Mountain Front Wheel
LL Road Front Wheel
ML Road Front Wheel
HL Road Front Wheel
Touring Front Wheel
LL Mountain Rear Wheel
ML Mountain Rear Wheel
HL Mountain Rear Wheel
LL Road Rear Wheel
ML Road Rear Wheel
HL Road Rear Wheel
Touring Rear Wheel
(14 row(s) affected)
Pour comprendre les résultats de cette requête, considérez les noms de chaque produit un par un. La valeur provoque-t-elle le retour d'au moins une ligne par la sous-requête ? En d'autres termes, le test d'existence retourne-t-il la valeur TRUE ?
Les sous-requêtes introduites par EXISTS sont légèrement différentes des autres sous-requêtes pour les raisons suivantes :
- Le mot clé EXISTS n'est pas précédé d'un nom de colonne, d'une constante ou de toute autre expression.
- La liste de sélection d'une sous-requête introduite par EXISTS se résume presque toujours à un astérisque (*). Il est inutile d'énumérer les noms de colonnes puisque vous effectuez un simple test d'existence sur les lignes qui remplissent les conditions spécifiées dans la sous-requête.
Le mot clé EXISTS est très important, car il y a rarement une autre formulation sans sous-requête. Bien que certaines requêtes créées avec EXISTS ne puissent pas être exprimées autrement, de nombreuses requêtes peuvent utiliser IN ou un opérateur de comparaison modifié par ANY ou ALL pour obtenir des résultats semblables.
Par exemple, la requête précédente peut être exprimée à l'aide de IN
:
USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE ProductSubcategoryID IN
(SELECT ProductSubcategoryID
FROM Production.ProductSubcategory
WHERE Name = 'Wheels')