在子查询中限定列名

在下列示例中,外部查询的 WHERE 子句中的 CustomerID 列是由外部查询的 FROM 子句中的表名 (Sales.Store) 隐性限定的。对子查询的选择列表中 CustomerID 的引用则是由子查询的 FROM 子句(即通过 Sales.Customer 表)来限定的。

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

一般的规则是,语句中的列名通过同级 FROM 子句中引用的表来隐性限定。如果子查询的 FROM 子句中引用的表中不存在列,则它是由外部查询的 FROM 子句中引用的表隐性限定的。

下例是使用这些隐性假设限定后查询的样式:

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

显式表述一个表名绝对不会出错,而且用显式限定替代有关表名的隐性假定总是可能的。

注意事项注意

如果某个子查询中引用的列不存在于该子查询的 FROM 子句引用的表中,而存在于外部查询的 FROM 子句引用的表中,则该查询可以正确执行。SQL Server 会用外部查询中的表名隐式限定该子查询中的列。