Cross Apply vs"逗号加入"

时间:2017-03-14 22:18:19

标签: sql-server sql-server-2012 cross-apply

我有一位同事喜欢使用她所说的“逗号加入”#34;。我最近在现场环境中第一次使用交叉申请,并注意到它与她的#逗号加入"相同的结果。并且想知道这两者是否存在不同之处,或者她的方式是否只是空手而已。下面我有两个临时表的代码,然后它执行交叉应用将第一个临时表中的所有内容附加到第二个中的所有内容。它也可以用她的#逗号加入"。

Select
    'a' as a,'b' as b,'c' as c,'d' as d
Into #letter


Create table #name
( name  varchar(10))

Insert Into #Name
Values('David'),('Kai'),('Brad'),('Todd'),('Vivian')



Select *
From #Name
Cross apply(Select * from #letter) as A

Select *
    From #name
    ,#letter

这些只是不同的写入方式或在某些情况下它做了不同的事情吗?哦,我们使用SQL 2012。

1 个答案:

答案 0 :(得分:3)

正如SqlZim指出的那样,这些“逗号连接”是一种旧式的连接表的方式,称为隐式连接。
这种连接的连接条件在where子句中 - 例如 -

SELECT *
FROM a, b
WHERE a.Id = b.aId

相同
SELECT *
FROM a
INNER JOIN b ON a.Id = b.aId

对于我希望显而易见的原因,隐式(或旧式)连接是不受欢迎的 - 正如您可能很容易想象的那样,当您需要连接两个以上的表时,与显式连接相比,它变得非常难以理解。

然而,

Cross apply根本不是联接。 Cross apply意味着您执行左侧每行cross apply运算符右侧的任何内容。

您发布的隐式连接语句的更准确的显式连接将是

SELECT *
FROM #name
CROSS JOIN #letter

另一种选择是使用具有连接条件的内连接,该连接条件将始终评估为true - 如下所示:

SELECT *
FROM #name
INNER JOIN #letter ON 1=1