我在一个意想不到的地方不理解带有ON的FROM子句

时间:2016-03-10 01:53:18

标签: sql-server tsql

我继承了一个查询。它是一些查询设计者的产物。查询的形式是:

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,就像使用'join'的第二,第三和第四行一样。我不知道我应该如何用一个没有'on'的表来读取这个查询,然后连续两个'on'连续。

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

TIA

2 个答案:

答案 0 :(得分:3)

您可以使用括号更好地理解查询:

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没有使用后续on的任何用法都难以理解。

答案 1 :(得分:1)

如果您想象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"。

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

无论如何,现在你需要改变它,随时可以用一种更容易理解的形式重新编写,例如

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