内连接和交叉应用。如何评估?

时间:2015-07-20 21:30:46

标签: sql sql-server join cross-apply

如果内连接是:对于左表中的每一行,在右表中找到满足条件的行。

什么是交叉申请?我已经读过它只是逐行评估的内部连接,但是内部连接是否也是逐行评估的?

您如何用简单的英语解释交叉申请?它只是内连接,但允许更复杂的连接?

2 个答案:

答案 0 :(得分:2)

  1. 内部加入(或简称加入):

    给出2个表,A和B,以及与A和B相关的条件C(最常见的是,2个字段之间的等式关系,A中的一个和B中的一个),基于C将表A与B连接起来意味着,对于A中的每一行,检查B中满足C的行 - 并返回它们。

    将其翻译成一个例子:

    SELECT * FROM A.field1 = B.field5

    上的内连接B.

    这里,对于A中的每一行,检查B中的行,其中A的field1等于B的field5。 返回所有这些行。

  2. 交叉加入

    不基于显式条件的连接 - 而是 - 它将A中的每一行与B中的每一行组合在一起,并返回这些行。

    假设A有10行而B 20,你会得到200行的结果集。

  3. 交叉申请 :(我刚才了解到,感谢你:)

    交叉应用确实与交叉连接有关,因此它的名称也带有“交叉”。据我所知,在交叉申请中会发生什么:

    给定表A和函数F,对于来自A的给定select语句选择的每一行,将其与F的结果交叉连接。 假设A有10行,而F只是一个返回3个常量行的函数,比如

    <强> 1

    <强> 2

    第3

    对于A中的10行中的每一行,您将交叉连接来自F的3个结果行。导致30行的结果集。

    现在,为了这个陈述的目的,我想我无能为力。 在阅读了一些SO线程之后,我能想到的是它在这种交叉连接操作中提供了性能提升(您可以在不使用诸如F和“交叉应用”之类的功能的情况下实现相同的结果)。

    This post提供了一个实现此类性能提升的场景示例。

答案 1 :(得分:2)

APPLYJOIN的不同之处在于它允许相关的子查询。例如:

SELECT ...
FROM outer
APPLY (
  SELECT ..
  FROM inner WHERE outer.column = inner.column
) 

首先,在考虑关系函数之前,这似乎没什么区别。由于APPLY接受来自另一方的相关性,这意味着您可以将其作为参数传递给函数:

SELECT ...
FROM outer
APPLY function(outer.column) 

这是JOIN无法实现的。

CROSS vs. OUTER与JOINs相同。