当选择CROSS APPLY和EXISTS时?

我读过,CROSS APPLY就像JOIN ..我认为JOIN可以用EXISTS完成(相关的子查询)

我很困惑,使用CROSS APPLY和EXISTS有什么不同?

我应该什么时候进行CROSS APPLY对抗EXISTS?


CROSS APPLY不仅仅是一个JOIN。 JOIN查找两组数据之间的匹配(或不匹配)行。 CROSS APPLY是针对你应用的每一行运行查询的一种方法。 这可以充当过滤机制,就像JOIN的工作方式一样,但是它对每一行都应用了某些东西,所以需要考虑这一点。

子查询中的EXISTS是完全不同的过滤机制。 这是一种快速识别的方法,因为它在发现问题时会立即将其搜索短路。 一般来说,您希望使用EXISTS的地方是,您可能会对筛选条件产生影响,从而尽可能缩短搜索范围。 但是,EXISTS找不到所有匹配项。 它只是找到第一个匹配,然后停止搜索。

所以虽然你可以从这三种不同的方法得到相同的结果,但是按照定义使用它们,你将会是正确的。 如果你真的加入两组数据,使用JOIN。 如果要针对数据集中的每一行运行进程(通常是过滤器),请使用CROSS APPLY。 如果您想在可能的正匹配上使用快速过滤器,请使用EXISTS。


格兰特的回应是正确的钱但从个人风格的角度来看,我只使用OUTER APPLY。 这里有一个通用的模式,所有这三个都做同样的事情,但通过使用outer apply,在验证时可以简要地注释掉“WHERE ca2.HasAddress ='Yes'”,并将ca2.HasAddress添加到main select以验证您的过滤器将删除您想要的记录,而其他两种过滤方法在行级别不提供相同的透明度。

SELECT c.CustomerID
FROM SalesLT.Customer c
OUTER APPLY (SELECT TOP 1 'Yes' HasAddress
             FROM SalesLT.CustomerAddress ca
             WHERE c.CustomerID = ca.CustomerID)
             ca2
WHERE ca2.HasAddress = 'Yes'

SELECT c.CustomerID 
FROM SalesLT.Customer c
CROSS APPLY (SELECT TOP 1 'Yes' HasAddress
             FROM SalesLT.CustomerAddress ca
             WHERE c.CustomerID = ca.CustomerID)
             ca2

SELECT c.CustomerID 
FROM SalesLT.Customer c
WHERE EXISTS (SELECT 1
             FROM SalesLT.CustomerAddress ca
             WHERE c.CustomerID = ca.CustomerID)
链接地址: http://www.djcxy.com/p/86219.html

上一篇: when choose CROSS APPLY and when EXISTS?

下一篇: what is the equivalent query in mysql?