相关子查询
许多查询都可以通过执行一次子查询并将得到的值代入外部查询的 WHERE 子句中进行计算。在包括相关子查询(也称为重复子查询)的查询中,子查询依靠外部查询获得值。这意味着子查询是重复执行的,为外部查询可能选择的每一行均执行一次。
此查询在 SalesPerson 表中检索奖金为 5000 且雇员标识号与 Employee 和 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
下面是结果集。
LastName FirstName EmployeeID
------------------------- ----------------- -----------
Ansman-Wolfe Pamela 280
Saraiva José 282
(2 row(s) affected)
该语句中前面的子查询无法独立于外部查询进行计算。它需要 Employee.EmployeeID 值,但是此值随 SQL Server 检查 Employee 中的不同行而改变。
下面准确说明了如何计算此查询:SQL Server 通过将每一行的值代入内部查询,考虑 Employee 表中的每一行是否都包括在结果中。例如,如果 SQL Server 首先检查 Syed Abbas 行,那么变量 Employee.EmployeeID 将取值 288,SQL Server 将该值代入内部查询。
USE AdventureWorks;
GO
SELECT Bonus
FROM Sales.SalesPerson
WHERE SalesPersonID = 288;
结果为 0(Syed Abbas 没有收到奖金,因为他不是销售人员),因此外部查询计算为:
USE AdventureWorks;
GO
SELECT LastName, FirstName
FROM Person.Contact c JOIN HumanResources.Employee e
ON e.ContactID = c.ContactID
WHERE 5000 IN (0.00);
由于这是假的,因此 Syed Abbas 行不包括在结果中。对 Pamela Ansman-Wolfe 行运行相同的过程,您会发现此行没有包括在结果中。
通过在外部查询中引用表中的列作为表值函数的参数,相关子查询也可以在 FROM 子句中包含表值函数。在这种情况下,对于外部查询的每一行,将根据子查询计算表值函数。