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
.
Я не уверен, почему кто-то это сделает. Может быть, скобки были отброшены на какой-то стадии «очистки». Это могло бы быть просто, что при написании запроса этот синтаксис имел смысл, и человек никогда не замечал, насколько неудобен запрос (в примечании: У меняникогда ничего подобного не делал;). Это может быть намеренное обфускация.
Первый отправленный код выглядит недействительным. Тривиально (игнорируя семантическую структуру) [имеется только одно предложение ON (или 'join_condition'), разрешенное для JOIN] (http://dev.mysql.com/doc/refman/5.7/en/join.html). – user2864740