基于以下示例,交叉应用和内部连接之间的差异

Aj.*_*.na 7 sql-server sql-server-2012

下面我有两个表#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)
Run Code Online (Sandbox Code Playgroud)

我也有以下两个问题: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
Run Code Online (Sandbox Code Playgroud)

结果:

col1    col1
1        2
2        4
3        3
Run Code Online (Sandbox Code Playgroud)

第二个查询是

随着交叉申请:

SELECT *
FROM   #temp t1
       CROSS apply (SELECT Sum(col1) AS col1
                    FROM   #temp2 t2
                    WHERE  t1.col1 = t2.col1) A
Run Code Online (Sandbox Code Playgroud)

结果:

col1    col1
1        2
2        4
3        3
6       NULL
Run Code Online (Sandbox Code Playgroud)

现在,我想知道CROSS APPLY和INNER JOIN之间的区别.我知道CROSS APPLY像INNER JOIN类似为每申请将execute.But我正在基于上述结果集的任何一个可以解释不同的结果集#TEMP(第一台)交叉的每一条记录?

提前致谢.

Jer*_*ell 6

如果我对交叉应用的理解是正确的,那么你在这里获得不同结果的原因是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
Run Code Online (Sandbox Code Playgroud)

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