我有一位同事喜欢使用她所说的“逗号连接”。我最近在现场环境中第一次使用了交叉应用,并注意到它给出了与她的“逗号连接”相同的结果,并且想知道两者是否有什么不同,或者她的方式是否只是速记。下面我有代码创建两个临时表,然后进行交叉应用,将第一个临时表中的所有内容附加到第二个临时表中的所有内容。它还通过她的“逗号连接”来实现这一点。
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。
最佳答案
正如 SqlZim 指出的那样,这些“逗号连接”是一种称为隐式连接的旧式表连接方式。
这种连接的连接条件位于 where 子句中 - 例如 -
SELECT *
FROM a, b
WHERE a.Id = b.aId
与
相同SELECT *
FROM a
INNER JOIN b ON a.Id = b.aId
由于我希望是显而易见的原因,隐式(或旧式)联接不受欢迎 - 正如您可能很容易想象的那样,当您需要联接两个以上的表时,与显式联接相比,它变得非常难以阅读。
Cross apply
然而,它根本不是连接。
交叉应用的意思是您对左侧的每一行执行交叉应用运算符右侧的任何内容。
对于您发布的隐式连接语句,更准确的显式连接是
SELECT *
FROM #name
CROSS JOIN #letter
另一种选择是使用内部联接,其联接条件始终为 true
- 如下所示:
SELECT *
FROM #name
INNER JOIN #letter ON 1=1
关于sql-server - 交叉应用与 "comma Join",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42797613/