带有两个 ON 子句的 SQL 连接(嵌套连接?)

SEa*_*986 2 sql sql-server syntax join

我正在调试由其他人创建的报告,它具有以下加入条件。(我已根据自己的喜好进行了布局,并对表名进行了匿名化处理)

SELECT  --columns
FROM    Table1
        JOIN Table2
        JOIN Table3
            ON Table2.pred = Table3.pred
        JOIN Table4
            ON Table2.pred = Table4.pred
        JOIN Table5
            ON Table2.pred = Table5.pred AND Table2.pred = Table5.pred AND Table3.pred = Table5.pred
        JOIN Table6
            ON Table3.pred = Table6.pred
            ON Table1.pred = Table5.pred AND Table1.pred = Table5.pred
        LEFT JOIN Table7
            ON Table5.pred = Table7.pred AND Table5.pred = Table7.pred
        LEFT JOIN Table7 AS Table7_1
            ON Table5.pred = Table7_1.pred AND Table5.pred = Table7_1.pred
WHERE   --conditions
Run Code Online (Sandbox Code Playgroud)

我感到困惑的是,没有将 Table1 与表 2 关联的联接,并且在联接到表 6 之后有两个 ON 子句。通常会联接多个表:

FROM  Table
      JOIN Table2
          ON --criteria
      JOIN Table3
          ON --criteria
      JOIN Table4
          ON --criteria
      --etc
Run Code Online (Sandbox Code Playgroud)

该查询有效,但当有人试图弄清楚它在做什么时,我很挣扎,因为我以前从未见过连接语法。

有人能给我解释一下语法吗?

Gor*_*off 5

这是有效的语法。这是一个更简单的例子:

from t1 join
     t2 join
     t3
     on t2.? = t3.?
     on t1.? = t2.?
Run Code Online (Sandbox Code Playgroud)

如果加上括号,就更有意义了:

from t1 join
     (t2 join
      t3
      on t2.? = t3.?
     ) on t1.? = t2.?
Run Code Online (Sandbox Code Playgroud)

尽管允许,但我强烈建议您不要使用此语法。重写查询,使joins 和ons 交错。