下面我有两张表#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)
我还有两个问题 INNER JOIN:
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
第二个查询是
使用CROSS APPLY:
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(第一个表)的每个记录交叉申请都会执行。但是我得到基于上述结果集的不同结果集可以任何一个请解释吗?
提前致谢。
答案 0 :(得分:5)
如果我对交叉应用的理解是正确的,那么你在这里获得不同结果的原因是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相同的结果。