交叉应用与 "comma Join"
Cross Apply vs "comma Join"
我有一个同事喜欢使用她称之为 "comma join" 的东西。我最近第一次在现场环境中使用交叉应用,并注意到它给出了与她 "comma join" 相同的结果,并且想知道这两者是否有什么不同,或者她的方法是否只是简写。下面我有代码生成两个临时 table,然后交叉应用将第一个临时 table 中的所有内容附加到第二个临时中的所有内容。它也对她这样做 "comma join".
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 所指出的,这些 "comma joins" 是一种旧式的表连接方式,称为隐式连接。
这种连接的连接条件在 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
我有一个同事喜欢使用她称之为 "comma join" 的东西。我最近第一次在现场环境中使用交叉应用,并注意到它给出了与她 "comma join" 相同的结果,并且想知道这两者是否有什么不同,或者她的方法是否只是简写。下面我有代码生成两个临时 table,然后交叉应用将第一个临时 table 中的所有内容附加到第二个临时中的所有内容。它也对她这样做 "comma join".
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 所指出的,这些 "comma joins" 是一种旧式的表连接方式,称为隐式连接。
这种连接的连接条件在 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