sql-server - 交叉应用与 "comma Join"

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

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

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/

相关文章:

sql-server - 根据包含 "From"和 "To"日期的字段确定未覆盖的天数

sql-server - 带有存储过程和参数的 ASP 经典 SQL Server XML 格式

SQL插入函数(插入增量值)

sql - 重命名 SQL 列错误 : Either the parameter @objname is ambiguous or the claimed @objtype (COLUMN) is wrong

sql - SQL - 扩展由交叉应用和枢轴组成的查询

sql - 我如何找到日期格式的数据透视列

sql-server - 将值插入 SQL Server 数据库

sql - 连接各种字符

sql-server - SQL Server : Pulling updated data from a function during a CROSS APPLY

performance - CROSS APPLY 运行速度太慢 - SQL