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 AdventureWorks;
GO
SELECT DISTINCT c.LastName, c.FirstName, e.EmployeeID 
FROM Person.Contact AS c JOIN HumanResources.Employee AS e
ON e.ContactID = c.ContactID 
WHERE 5000.00 IN
    (SELECT Bonus
     FROM Sales.SalesPerson sp
     WHERE e.EmployeeID = sp.SalesPersonID) ;
GO

Voici l'ensemble des résultats.

LastName FirstName EmployeeID

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

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.EmployeeID, 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.EmployeeID prend la valeur 288, que SQL Server entre ensuite dans la requête interne.

USE AdventureWorks;
GO
SELECT Bonus
FROM Sales.SalesPerson
WHERE SalesPersonID = 288;

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

USE AdventureWorks;
GO
SELECT LastName, FirstName
FROM Person.Contact c JOIN HumanResources.Employee e
ON e.ContactID = c.ContactID 
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.