一个接一个有两个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个表都被连接在一起?
答案 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
的值。