【问题标题】:I don't understand a FROM clause with ON in an unexpected place我不明白 FROM 子句在一个意想不到的地方
【发布时间】:2016-06-24 16:32:52
【问题描述】:

我继承了一个查询。它是一些查询设计器的产品。查询形式为:

select stuff
    from a
        join b
        join c on b.k = c.k
        join d on c.j = d.j
        on a.l = d.l
            and a.m = d.m
        join e on a.n = e.n

我希望加入是join t1 on t1.f = t0.f,就像第二行、第三行和第四行带有“加入”一样。我不知道我应该如何阅读这个查询,它后面没有一个“on”,然后是连续两个“on”。

但是服务器不介意。它返回了一个对我们非常有用的数据集,直到现在我们想要更改我们正在选择的东西。服务器是如何解析的?

TIA

【问题讨论】:

  • This question 可能对您有所帮助。我相信缺少的ON 子句会导致您的查询被解释为具有嵌套子查询。
  • 这里没有嵌套查询。

标签: sql-server tsql


【解决方案1】:

你会用括号更好地理解查询:

select stuff
from a join
     (b join
      c
      on b.k = c.k join
      d
      on c.j = d.j
     )
     on a.l = d.l and a.m = d.m join
     e
     on a.n = e.n

对于内部连接,括号无关紧要。这种逻辑对外部连接很重要,但坦率地说,我从来没有发现它有必要。我发现在没有后续 on 的情况下使用 join 很难理解。

【讨论】:

  • 我不认为有一些官方文档说明 TSQL 在这种情况下如何不需要括号?
  • @SkipSaillors 。 . .如果你仔细阅读语法,你会看到一个连接是table_source "join" table_source on conditionstable_source 反过来可以是一个表或一个连接表达式(或一堆其他东西)。因此,语法确实描述了这种语法。
【解决方案2】:

如果您想象 SQL Server 在您的查询中暗示了一些括号,这可能会有所帮助,例如

select stuff
from a
    join 
    (
        b
        join c on b.k = c.k
        join d on c.j = d.j
    )
    on a.l = d.l and a.m = d.m
    join e on a.n = e.n

这就像说“将 a 加入到结果中:b 加入到 c 加入到 d。然后加入 e”。

请记住,连接操作是可交换的,即连接的顺序对结果集没有任何影响。查询优化器通常会重新排列连接以获得性能最佳的物理连接顺序。您可以查看执行计划以了解选择的实际物理连接顺序。

无论如何,现在您需要随时更改它,以更容易理解的形式重新编写,例如

select stuff
from b
join c on b.k = c.k   
join d on c.j = d.j
join a on a.l = d.l and a.m = d.m
join e on a.n = e.n

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 2014-10-30
    相关资源
    最近更新 更多