所以我看到了一些执行此操作的代码......
select *
from A
left join B
left Join C
on C.column1 = B.column3
on B.column2 = A.column4
and C.column5 > 0
and B.column6 < 0
相当于
select *
from A
left join B
on B.column2 = A.column4
and B.column6 < 0
left Join C
on C.column1 = B.column
and C.column5 > 0
为什么有人会做第一个代码片段?这可能是一个错字吗?
答案 0 :(得分:3)
MySQL的连接语法比ANSI标准更宽松。事实上,documentation的一部分专门用于这个主题。
第一个查询确实是可接受的语法,如此SQL Fiddle所示。此查询(相同查询,不同格式):
select *
from A left join
B left Join
C
on C.column1 = B.column3
on B.column2 = A.column4 and C.column5 > 0 and B.column6 < 0
被解释为有括号:
select *
from A left join
(B left Join
C
on C.column1 = B.column3
)
on B.column2 = A.column4 and C.column5 > 0 and B.column6 < 0;
您可以通过交换on
条款来说服自己。这个查询:
select *
from A left join
B left Join
C
on B.column2 = A.column4 and C.column5 > 0 and B.column6 < 0
on C.column1 = B.column3;
产生错误。第一个A
子句不知道on
表引用,因为该连接只在B
和C
之间。
我不确定为什么有人会这样做。可能是括号被删除了一些&#34;清理&#34;相。可能只是在编写查询时,这种语法很有意义,而且这个人从未注意到查询有多尴尬(作为一个注释:我 永远不会完成这样的事情 ;)。这可能是故意混淆。