【问题标题】:Inner join and cross apply. How does it get evaluated?内连接和交叉应用。它是如何被评估的?
【发布时间】:2015-07-20 21:30:45
【问题描述】:

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

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

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

【问题讨论】:

标签: sql sql-server join cross-apply


【解决方案1】:

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 相同。

【讨论】:

  • 您能解释一下“应用接受来自另一方的相关性”是什么意思吗?
  • 这意味着在内部查询中,您可以从外部表的“当前”行中引用一列。见correlated subquery
【解决方案2】:
  1. 内连接(或简单连接):

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

    翻译成例子:

    SELECT * FROM A 内连接 B on A.field1 = B.field5

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

  2. 交叉连接

    不基于显式条件的连接 - 相反 - 它将 A 中的每一行与 B 中的每一行结合起来,并返回这些行。

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

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

    交叉应用确实与交叉连接有关,因此它的名称中也带有“交叉”。据我了解,交叉应用中发生的情况是:

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

    1

    2

    3

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

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

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

【讨论】:

  • 感谢您花时间回答,但我的意思是交叉申请。
  • 糟糕,我操之过急。希望我最终以某种方式提供帮助,在编辑答案并提供一些交叉应用之后。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-10
  • 2017-10-23
  • 2021-06-03
  • 2010-09-09
  • 2013-04-16
  • 1970-01-01
相关资源
最近更新 更多