首页 > 解决方案 > 多个 on 语句如何在单个内部联接中工作?

问题描述

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

标签: sql-servertsqljoin

解决方案


这意味着连接是嵌套的,因此 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 语句可能会引发错误,直到它们像我上面所做的那样被转置。


推荐阅读