Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 多个on语句如何在单个内部联接中工作?_Sql Server_Tsql_Join - Fatal编程技术网

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当前超出范围,但是,在切换最后两行后,它运行良好。