交叉应用与“逗号连接”

Cha*_*man 2 sql-server cross-apply sql-server-2012

我有一位同事喜欢使用她所说的“逗号连接”。我最近在现场环境中第一次使用了交叉应用,并注意到它给出了与她的“逗号连接”相同的结果,并且想知道两者是否有什么不同,或者她的方式是否只是速记。下面我有代码创建两个临时表,然后进行交叉应用,将第一个临时表中的所有内容附加到第二个临时表中的所有内容。它还通过她的“逗号连接”来实现这一点。

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
Run Code Online (Sandbox Code Playgroud)

那么这些是相同的只是不同的编写方式还是在某些情况下会做不同的事情?哦,我们使用 SQL 2012。

Zoh*_*led 5

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

SELECT *
FROM a, b
WHERE a.Id = b.aId
Run Code Online (Sandbox Code Playgroud)

是相同的

SELECT *
FROM a
INNER JOIN b ON a.Id = b.aId
Run Code Online (Sandbox Code Playgroud)

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

Cross apply然而,它根本不是连接。这Cross apply意味着您cross apply对左侧的每一行执行运算符右侧的任何内容。

对于您发布的隐式连接语句,更准确的显式连接是

SELECT *
FROM #name
CROSS JOIN #letter
Run Code Online (Sandbox Code Playgroud)

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

SELECT *
FROM #name
INNER JOIN #letter ON 1=1
Run Code Online (Sandbox Code Playgroud)