Share via


Sous-requêtes et opérateurs de comparaison

Les sous-requêtes peuvent être introduites par l'un de ces opérateurs de comparaison (=, < >, >, > =, <, ! >, ! < ou < =).

Une sous-requête introduite par un opérateur de comparaison non modifié (autrement dit, un opérateur de comparaison non suivi de ANY ou de ALL) ne doit retourner qu'une seule valeur et non une liste de valeurs, à l'instar des sous-requêtes introduites par IN. Si une sous-requête de ce type retourne plusieurs valeurs, SQL Server affiche un message d'erreur.

Pour utiliser une sous-requête introduite par un opérateur de comparaison non modifié, et savoir si elle ne va retourner qu'une seule valeur, vous devez bien connaître vos données et la nature du problème.

Par exemple, supposons que chaque commercial couvre uniquement un territoire commercial, et que vous voulez trouver le nom des clients situés dans le territoire couvert par Linda Mitchell, vous pouvez écrire une instruction comportant une sous-requête introduite par le seul opérateur de comparaison = (signe égal).

USE AdventureWorks2008R2;
GO
SELECT CustomerID
FROM Sales.Customer
WHERE TerritoryID =
    (SELECT TerritoryID
     FROM Sales.SalesPerson
     WHERE BusinessEntityID = 276)

toutefois, si Linda Mitchell couvre plusieurs territoires commerciaux, un message d'erreur s'affiche. À la place de l'opérateur de comparaison = (signe égal), vous pouvez utiliser une sous-requête introduite par IN (= ANY fonctionne aussi).

Étant donné que les fonctions d'agrégation retournent une seule unique, elles figurent souvent dans les sous-requêtes introduites par un opérateur de comparaison non modifié. Par exemple, l'instruction suivante recherche le nom de tous les produits dont le tarif est supérieur au tarif moyen.

Use AdventureWorks2008R2;
GO
SELECT Name
FROM Production.Product
WHERE ListPrice >
    (SELECT AVG (ListPrice)
     FROM Production.Product)

Puisque les sous-requêtes introduites par un opérateur de comparaison non modifié ne doivent retourner qu'une seule valeur, elles ne peuvent pas contenir de clauses GROUP BY ou HAVING, sauf si vous savez que celles-ci ne retournent qu'une seule valeur également. Par exemple, la requête suivante trouve les produits vendus plus chers que le produit le moins cher de la sous-catégorie 14.

Use AdventureWorks2008R2;
GO
SELECT Name
FROM Production.Product
WHERE ListPrice >
    (SELECT MIN (ListPrice)
     FROM Production.Product
     GROUP BY ProductSubcategoryID
     HAVING ProductSubcategoryID = 14)

Voir aussi

Concepts