什么时候选择CROSS APPLY和EXISTS?

问题描述:

我读,CROSS APPLY就好比JOIN ..我想加盟可以完成同样存在(相关子查询)什么时候选择CROSS APPLY和EXISTS?

我很困惑,就是在使用CROSS APPLY和存在区别?

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

+1

除了格兰特的评论我会提到“交叉申请”和“外部申请”是异国情调的操作。您可以长时间在没有使用APPLY的情况下完成许多重要工作。不要不鼓励对此进行学习并记住它,但你会发现申请APPLY的机会并非每天都在。如果你可以借用Itzik Ben-Gan的TSQL查询副本,或者在线阅读一些页面,他会有一章叫做“TOP and APPLY”。我会说的应用程序是1)典型的,2)不是很令人兴奋。 – 2012-03-12 11:53:25

+0

是的,Itzik Ben-Gan的书是+10。这是必须拥有的。 – 2012-03-12 12:39:15

+0

@GrantFritchey:+10?!!通常人们给+1 ..:D;) – dotNETbeginner 2012-03-12 13:00:47

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

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

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