gpt4 book ai didi

sql-server - 基于以下示例,交叉应用和内部联接之间的区别

转载 作者:行者123 更新时间:2023-12-02 16:14:45 24 4
gpt4 key购买 nike

下面我有两个表#temp 和#temp2。

 create table #temp
(
col1 int
)

insert into #temp values(6),(1),(2),(3),(null)



create table #temp2
(
col1 int
)
insert into #temp2 values(1),(2),(1),(2),(3),(null)

下面我还有两个疑问使用内部连接:

 SELECT t1.col1,
Sum(t2.col1) AS col1
FROM #temp t1
INNER JOIN #temp2 t2
ON t1.col1 = t2.col1
GROUP BY t1.col1

结果:

col1    col1
1 2
2 4
3 3

第二个查询是

通过交叉应用:

SELECT *
FROM #temp t1
CROSS apply (SELECT Sum(col1) AS col1
FROM #temp2 t2
WHERE t1.col1 = t2.col1) A

结果:

col1    col1
1 2
2 4
3 3
6 NULL

现在,我想知道 CROSS APPLY 和 INNER JOIN 之间的区别。我知道 CROSS APPLY 类似于​​ INNER JOIN 对于 #temp(first table) 的每条记录都会执行 cross apply。但是我根据上述结果集得到不同的结果集 谁能解释一下吗?

提前致谢。

最佳答案

如果我对交叉应用的理解是正确的,那么您在这里得到不同结果的原因是交叉应用会将应用(右侧运算符)之后的任何内容应用于左侧运算符(#temp)中的每一行。这意味着结果中的行数将与#temp 中的行数相同。我的答案基于“表值函数充当右输入,外表表达式充当左输入。对左输入中的每一行评估右输入,并将生成的行组合起来作为最终输出。 ”来自https://technet.microsoft.com/en-us/library/ms175156(v=sql.105).aspx

请注意,如果您确实希望结果相同,您可以将交叉应用查询更改为:

SELECT *
FROM #temp t1
CROSS apply (SELECT Sum(col1) AS col1
FROM #temp2 t2
WHERE t1.col1 = t2.col1) A
WHERE A.col1 IS NOT NULL

另请注意,INNER JOIN 定义为双方都匹配的情况。在你的例子中,这意味着只有 3 行。如果您使用 LEFT OUTER 连接,则在这种情况下您将获得与 CROSS APPLY 相同的结果。

关于sql-server - 基于以下示例,交叉应用和内部联接之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33894884/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com