我继承了一个查询。它是一些查询设计者的产物。查询的形式是:
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
答案 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