Sous-requêtes en corrélation

De nombreuses requêtes peuvent être évaluées en exécutant une fois la sous-requête et en entrant la ou les valeurs obtenues dans la clause WHERE de la requête externe. Dans les requêtes qui contiennent une sous-requête en corrélation (aussi appelée sous-requête répétitive), la sous-requête dépend de la requête externe pour ses valeurs. Cela signifie que la sous-requête s'exécute de manière répétitive, une fois pour chaque ligne que la requête externe pourrait sélectionner.

Cette requête extrait une instance du prénom et du nom de famille de chaque employé pour lequel la commission est égale à 5 000 dans la table SalesPerson et dont le numéro d'identification se trouve dans les tables Employee et SalesPerson.

USE AdventureWorks2008R2;
GO
SELECT DISTINCT c.LastName, c.FirstName, e.BusinessEntityID 
FROM Person.Person AS c JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = c.BusinessEntityID 
WHERE 5000.00 IN
    (SELECT Bonus
    FROM Sales.SalesPerson sp
    WHERE e.BusinessEntityID = sp.BusinessEntityID) ;
GO

Voici l'ensemble des résultats.

LastName FirstName BusinessEntityID

-------------------------- ---------- ------------

Ansman-Wolfe Pamela 280

Saraiva José 282

(2 ligne(s) affectée(s))

La sous-requête précédente de cette instruction ne peut pas être évaluée indépendamment de la requête externe. Elle exige en effet une valeur pour Employee.BusinessEntityID, mais cette valeur change à mesure que SQL Server examine les différentes lignes de la table Employee.

Cette requête est évaluée de la manière suivante : SQL Server tente d'inclure chaque ligne de la table Employee dans les résultats en entrant la valeur de chaque ligne dans la requête interne. Par exemple, si SQL Server examine tout d'abord la ligne de Syed Abbas, la variable Employee.BusinessEntityID prend la valeur 285, que SQL Server entre ensuite dans la requête interne.

USE AdventureWorks2008R2;
GO
SELECT Bonus
FROM Sales.SalesPerson
WHERE BusinessEntityID = 285;

Le résultat est 0 (Syed Abbas n'a pas reçu de commission parce qu'il n'est pas commercial), de sorte que la requête externe donne :

USE AdventureWorks2008R2;
GO
SELECT LastName, FirstName
FROM Person.Person AS c JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = c.BusinessEntityID 
WHERE 5000 IN (0.00)

Puisque le résultat est faux, la ligne de Syed Abbas n'est pas incluse dans les résultats. Suivez la même procédure pour la ligne de Pamela Ansman-Wolfe. Vous constaterez qu'elle est incluse dans les résultats.

Les sous-requêtes en corrélation peuvent aussi inclure des fonctions table dans la clause FROM en référençant des colonnes d'une table dans la requête externe sous la forme d'argument de cette fonction table. Dans ce cas, pour chaque ligne de la requête externe, la fonction table est évaluée en fonction de la sous-requête.