我有一位同事喜欢使用她所说的“逗号加入”#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。
答案 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