内部连接和交叉应用。它是如何被评估的?

Inner join and cross apply. How does it get evaluated?

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

什么是交叉应用?我读过它只是内部连接逐行评估,但内部连接不是也逐行评估吗?

如何用通俗易懂的英语解释cross apply?它只是内部联接但允许更复杂的联接吗?

  1. 内部联接(或简单联接):

    给定 2 tables、A 和 B,以及关联 A 和 B 的条件 C(最常见的是 2 个字段之间的相等关系,一个来自 A,一个来自 B),加入table A with B based on C 意味着,对于 A 中的每一行,检查 B 中满足 C 的行 - 以及 return 它们。

    翻译成例子:

    SELECT * FROM A inner join B on A.field1 = B.field5

    在这里,对于 A 中的每一行,检查 B 中 A 的字段 1 等于 B 的字段 5 的行。 Return 所有这样的行。

  2. 交叉连接

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

    假设 A 有 10 行,B 有 20 行,您将得到 200 行的结果集。

  3. Cross Apply:(我刚学会,多亏了你:)

    交叉应用确实与交叉连接相关,因此它的名称中也包含 "cross"。据我了解,交叉申请中发生的情况是:

    给定一个 table A 和一个函数 F,对于由 A 的给定 select 语句 select 编辑的每一行,将其与 F 的结果交叉连接。 假设 A 有 10 行,F 只是一个 returns 3 个常量行的函数,比如

    1

    2

    3

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

    现在,创建此声明的目的是什么,我想我帮不上什么忙。 在阅读了一些 SO 线程之后,我想到的是它在此类交叉连接操作中提供了性能提升(您可以在不使用 F 和 "Cross-Apply" 等函数的情况下获得相同的结果)。

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

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

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

起初这似乎没有太大区别,直到您考虑关系函数。由于 APPLY 接受来自另一方的相关性,这意味着您可以将其值作为参数传递给函数:

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

这是 JOIN 做不到的。

CROSS 与 OUTER 与 JOIN 相同。