【问题标题】:SQL Join with two ON clauses (Nested Join?)带有两个 ON 子句的 SQL 连接(嵌套连接?)
【发布时间】:2017-10-03 13:54:58
【问题描述】:

我正在调试由其他人创建的报告,它具有以下加入条件。 (我已根据自己的喜好列出并匿名表名)

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

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

FROM  Table
      JOIN Table2
          ON --criteria
      JOIN Table3
          ON --criteria
      JOIN Table4
          ON --criteria
      --etc

查询有效,但作为试图弄清楚它在做什么的人,我正在苦苦挣扎,因为我以前从未见过联接语法。

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

【问题讨论】:

  • 您在编辑原始查询时是否遗漏了任何括号?
  • 有效语法,我写的时候已经给出了解释。您可能想告诉那个人重新考虑他们的道德规范。这是一个糟糕的代码,可以在 2 分钟内重做以提高可读性。
  • 同意,我将对其进行重组,但首先我需要了解什么加入了什么!

标签: sql sql-server join syntax


【解决方案1】:

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

from t1 join
     t2 join
     t3
     on t2.? = t3.?
     on t1.? = t2.?

如果用括号写,更有意义:

from t1 join
     (t2 join
      t3
      on t2.? = t3.?
     ) on t1.? = t2.?

虽然允许,但我强烈建议您不要使用这种语法。重写查询,使joins 和ons 交错。

【讨论】:

  • 谢谢,添加括号使其易于理解,可以重构为“合理”的语法
  • @SEarle1986 以增量方式构建查询有助于更清晰、更轻松地生成此类语法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 2014-09-17
相关资源
最近更新 更多