在SQL Server中,CROSS APPLY 和 OUTER APPLY 是用于将一个表值函数(TVF)或子查询应用于每一行输入的运算符。它们允许将外部查询的每一行与内部查询的结果集进行连接,适用于返回多个结果的关联查询。两者的主要区别在于处理结果集的方式。
1. CROSS APPLY
解释:
CROSS APPLY类似于INNER JOIN,仅返回输入表中与子查询或表值函数匹配的行。如果子查询或函数返回空结果集,则不会包含该行。
应用场景:
- 用于内连接操作,常用于过滤数据,使得只包含有匹配结果的行。
示例:
假设我们有两个表 Orders 和 OrderDetails,并且需要为每个订单返回对应的详细信息:
SELECT o.OrderID, d.ProductID, d.Quantity
FROM Orders o
CROSS APPLY (
SELECT od.ProductID, od.Quantity
FROM OrderDetails od
WHERE od.OrderID = o.OrderID
) d;
解释: CROSS APPLY 连接了 Orders 表中的每一行和 OrderDetails 表中与之匹配的行。若 OrderDetails 没有匹配的记录,该 OrderID 不会出现在结果中。
2. OUTER APPLY
解释:
OUTER APPLY类似于LEFT JOIN,即便子查询或函数返回空结果集,也会包含外部表的行,并用NULL填充结果列。
应用场景:
- 用于外连接操作,在某些情况下即便没有匹配的结果,仍希望将外部表的行返回。
示例:
使用 Orders 表来返回每个订单及其详细信息,如果没有详细信息,也会返回订单信息:
SELECT o.OrderID, d.ProductID, d.Quantity
FROM Orders o
OUTER APPLY (
SELECT od.ProductID, od.Quantity
FROM OrderDetails od
WHERE od.OrderID = o.OrderID
) d;
解释: 在此示例中,即便 OrderDetails 表中没有匹配的记录,Orders 表的 OrderID 仍然会显示,ProductID 和 Quantity 列用 NULL 填充。
总结
CROSS APPLY: 类似INNER JOIN,仅返回匹配的行。OUTER APPLY: 类似LEFT JOIN,即便没有匹配的结果,也返回外部表的行。
应用选择:
- 使用
CROSS APPLY当只需要包含匹配结果时。 - 使用
OUTER APPLY当需要返回所有外部表的行,无论是否有匹配时。
503

被折叠的 条评论
为什么被折叠?



