如果内连接是:对于左表中的每一行,在右表中找到满足条件的行。
什么是交叉申请?我已经读过它只是逐行评估的内部连接,但是内部连接是否也是逐行评估的?
您如何用简单的英语解释交叉申请?它只是内连接,但允许更复杂的连接?
答案 0 :(得分:2)
内部加入(或简称加入):
给出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。 返回所有这些行。
交叉加入:
不基于显式条件的连接 - 而是 - 它将A中的每一行与B中的每一行组合在一起,并返回这些行。
假设A有10行而B 20,你会得到200行的结果集。
交叉申请 :(我刚才了解到,感谢你:)
交叉应用确实与交叉连接有关,因此它的名称也带有“交叉”。据我所知,在交叉申请中会发生什么:
给定表A和函数F,对于来自A的给定select语句选择的每一行,将其与F的结果交叉连接。 假设A有10行,而F只是一个返回3个常量行的函数,比如
<强> 1 强>
<强> 2 强>
第3 强>
对于A中的10行中的每一行,您将交叉连接来自F的3个结果行。导致30行的结果集。
现在,为了这个陈述的目的,我想我无能为力。 在阅读了一些SO线程之后,我能想到的是它在这种交叉连接操作中提供了性能提升(您可以在不使用诸如F和“交叉应用”之类的功能的情况下实现相同的结果)。
This post提供了一个实现此类性能提升的场景示例。
答案 1 :(得分:2)
APPLY
与JOIN
的不同之处在于它允许相关的子查询。例如:
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相同。