【转】相关子查询2
或 http://technet.microsoft.com/zh-cn/library/ms187638.aspx
许多查询都可以通过执行一次子查询并将得到的值代入外部查询的 WHERE 子句中进行计算。在包括相关子查询(也称为重复子查询)的查询中,子查询依靠外部查询获得值。这意味着子查询是重复执行的,为外部查询可能选择的每一行均执行一次。
此查询在 SalesPerson 表中检索奖金为 5000 且雇员标识号与 Employee 和 SalesPerson 表中的标识号相匹配的雇员的名和姓的一个实例。
USE AdventureWorks; GO SELECT DISTINCT c.LastName, c.FirstName FROM Person.Contact c JOIN HumanResources.Employee e ON e.ContactID = c.ContactID WHERE 5000.00 IN (SELECT Bonus FROM Sales.SalesPerson sp WHERE e.EmployeeID = sp.SalesPersonID) ; GO
下面是结果集:
LastName FirstName Ansman-Wolfe Pamela Saraiva Jos (2 row(s) affected)
该语句中前面的子查询无法独立于外部查询进行计算。它需要 Employee.EmployeeID 值,但是此值随 Microsoft SQL Server 2005 检查 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 SELECT LastName, FirstName FROM Person.Contact c JOIN HumanResources.Employee e ON e.ContactID = c.ContactID WHERE 5000 IN (5000)
由于这是假的,因此 Syed Abbas 行不包括在结果中。对 Pamela Ansman-Wolfe 行运行相同的过程,您会发现此行没有包括在结果中。
通过在外部查询中引用表中的列作为表值函数的参数,相关子查询也可以在 FROM 子句中包含表值函数。在这种情况下,对于外部查询的每一行,将根据子查询计算表值函数。
posted on 2009-07-02 01:57 LeeXiaoLiang 阅读(108) 评论(0) 收藏 举报
浙公网安备 33010602011771号