Sql Multiple Join Syntax

时间:2014-05-09 02:07:31

标签: mysql sql join

所以我看到了一些执行此操作的代码......

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

为什么有人会做第一个代码片段?这可能是一个错字吗?

1 个答案:

答案 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表引用,因为该连接只在BC之间。

我不确定为什么有人会这样做。可能是括号被删除了一些&#34;清理&#34;相。可能只是在编写查询时,这种语法很有意义,而且这个人从未注意到查询有多尴尬(作为一个注释: 永远不会完成这样的事情 ;)。这可能是故意混淆。