内部连接和交叉应用。它是如何被评估的?
Inner join and cross apply. How does it get evaluated?
如果内连接是:对于左侧 table 的每一行,在右侧 table 找到满足条件的行。
什么是交叉应用?我读过它只是内部连接逐行评估,但内部连接不是也逐行评估吗?
如何用通俗易懂的英语解释cross apply?它只是内部联接但允许更复杂的联接吗?
内部联接(或简单联接):
给定 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 所有这样的行。
交叉连接:
不基于显式条件的连接 - 而是 - 它将 A 中的每一行与 B 中的每一行组合在一起,并且 returns 这样的行。
假设 A 有 10 行,B 有 20 行,您将得到 200 行的结果集。
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 提供了实现此类性能提升的场景示例。
APPLY
与 JOIN
的不同之处在于它允许相关子查询。例如:
SELECT ...
FROM outer
APPLY (
SELECT ..
FROM inner WHERE outer.column = inner.column
)
起初这似乎没有太大区别,直到您考虑关系函数。由于 APPLY 接受来自另一方的相关性,这意味着您可以将其值作为参数传递给函数:
SELECT ...
FROM outer
APPLY function(outer.column)
这是 JOIN
做不到的。
CROSS 与 OUTER 与 JOIN 相同。
如果内连接是:对于左侧 table 的每一行,在右侧 table 找到满足条件的行。
什么是交叉应用?我读过它只是内部连接逐行评估,但内部连接不是也逐行评估吗?
如何用通俗易懂的英语解释cross apply?它只是内部联接但允许更复杂的联接吗?
内部联接(或简单联接):
给定 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 所有这样的行。
交叉连接:
不基于显式条件的连接 - 而是 - 它将 A 中的每一行与 B 中的每一行组合在一起,并且 returns 这样的行。
假设 A 有 10 行,B 有 20 行,您将得到 200 行的结果集。
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 提供了实现此类性能提升的场景示例。
APPLY
与 JOIN
的不同之处在于它允许相关子查询。例如:
SELECT ...
FROM outer
APPLY (
SELECT ..
FROM inner WHERE outer.column = inner.column
)
起初这似乎没有太大区别,直到您考虑关系函数。由于 APPLY 接受来自另一方的相关性,这意味着您可以将其值作为参数传递给函数:
SELECT ...
FROM outer
APPLY function(outer.column)
这是 JOIN
做不到的。
CROSS 与 OUTER 与 JOIN 相同。