Sql server 多个on语句如何在单个内部联接中工作?
有两个条款,一个接一个,如下所示:Sql server 多个on语句如何在单个内部联接中工作?,sql-server,tsql,join,Sql Server,Tsql,Join,有两个条款,一个接一个,如下所示: select * from foo left join b on b.ID = foo.pID left join c inner join foo as f ON b.ID = f.pProject ON c.Name = f.Hostname 这是否意味着所有3个表都被联接在一起?这意味着联接是嵌套的,因此f和b之间的内部联接发生在它们与c一起外部联接之前。不过,我想你可能会有一些换位。这可以用一些缩进和括号重写,以使它更清晰 select * fr
select * from foo
left join b on b.ID = foo.pID
left join c
inner join foo as f
ON b.ID = f.pProject
ON c.Name = f.Hostname
这是否意味着所有3个表都被联接在一起?这意味着联接是嵌套的,因此f和b之间的内部联接发生在它们与c一起外部联接之前。不过,我想你可能会有一些换位。这可以用一些缩进和括号重写,以使它更清晰
select *
from foo
left join b
on b.ID = foo.pID
left join (c
join foo as f
ON c.Name = f.Hostname
)
ON b.ID = f.pProject
您可以将其视为JOIN关键字充当开括号,ON关键字充当嵌套匹配对中的闭括号。此操作的优先顺序或作用域是这样的:嵌套联接在嵌套联接完成之前无法访问封闭联接。因此,您最后两个ON语句可能会抛出一个错误,直到它们像我上面所做的那样被转换
select *
from foo
left join b
on b.ID = foo.pID
left join c
inner join foo as f
ON f.pProject = b.ID
ON c.Name = f.Hostname
我以前见过这种用法,但不是这样。我忘记了目的,但我知道它有很好的用途
在这种情况下,我认为它首先加入
f.pProject=b.ID
,这样就可以得到f.Hostname
的值了,我想我明白了。但是,我发布的代码没有抛出错误。它是一个更大的查询的一部分,执行时没有任何错误。我不知道为什么您的原始代码没有出现错误。当我在上的SQL Server中构建一些示例表并对其运行查询时,我得到以下错误:无法按预期绑定多部分标识符“b.ID”,因为b当前超出范围,但是,在切换最后两行后,它运行良好。