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



下面有两个表#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(第一个表)的每个记录,交叉应用都将执行。但基于以上结果集,我得到了不同的结果集。请解释一下?

提前谢谢。

如果我对交叉应用的理解是正确的,那么你在这里得到不同结果的原因是,交叉应用将把应用之后的任何内容(右运算符)应用到左运算符(#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相同的结果。

最新更新