Qualification de noms de colonnes dans des sous-requêtes

Dans l'exemple suivant, la colonne CustomerID indiquée dans la clause WHERE de la requête externe est implicitement qualifiée par le nom de table figurant dans la clause FROM de la requête externe, c'est-à-dire Sales.Store. La référence à la colonne CustomerID dans la liste de sélection de la sous-requête est qualifiée par la clause FROM de la sous-requête, c'est-à-dire par la table Sales.Customer.

USE AdventureWorks2008R2;
GO
SELECT Name
FROM Sales.Store
WHERE BusinessEntityID NOT IN
    (SELECT CustomerID
     FROM Sales.Customer
     WHERE TerritoryID = 5)

En règle générale, les noms de colonne précisés dans une instruction sont implicitement qualifiés par la table spécifiée dans la clause FROM appartenant au même niveau d'imbrication. Si une colonne n'existe pas dans la table référencée dans la clause FROM d'une sous-requête, elle est implicitement qualifiée par la table référencée dans la clause FROM de la requête externe.

Voici comment se présente la requête lorsque ces qualifications implicites sont clairement spécifiées :

USE AdventureWorks2008R2;
GO
SELECT Name
FROM Sales.Store
WHERE Sales.Store.BusinessEntityID NOT IN
    (SELECT Sales.Customer.CustomerID
     FROM Sales.Customer
     WHERE TerritoryID = 5)

Ce n'est pas une erreur d'exprimer explicitement le nom de table, et il est toujours possible d'annuler les qualifications implicites de noms de table avec des qualifications explicites.

AttentionAttention

Si une colonne est référencée dans une sous-requête qui n'existe pas dans la table référencée par la clause FROM de la sous-requête, mais qu'elle existe dans une table référencée par la clause FROM de la requête externe, la requête s'exécute sans erreur. SQL Server qualifie implicitement la colonne dans la sous-requête avec le nom de table indiqué dans la requête externe.