多个on语句如何在单个内连接中工作?

时间:2018-04-27 18:36:10

标签: sql-server tsql join

一个接一个有两个ON条款,如下:

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个表都被连接在一起?

2 个答案:

答案 0 :(得分:2)

这意味着连接是嵌套的,使得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语句可能会抛出一个错误,直到它们像我上面那样被转换。

答案 1 :(得分:0)

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的值。