下記の2つのSQLでは3つのテーブルを結合しています。
(a)
SELECT *
FROM table_a a LEFT JOIN table b b ON a.id = b.id, table_c c
WHERE a.id = c.id
(b)
SELECT *
FROM table_a a, table_c c LEFT JOIN table b b ON a.id = b.id
WHERE a.id = c.id
(a)はmysql4でもmysql5でも実行可能ですが、
(b)はmysql5ではエラーとなってしまいます。
「Unknown column 'a.id' in 'on clause」
この違いはなぜ起きるのでしょうか。
よろしくお願いします。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.2.7.1 JOIN 構文
仕様変更による物。
以前は、カンマ演算子(,)と JOIN の両方は同じ優先順位だったので、接合式 t1, t2 JOIN t3 は ((t1, t2) JOIN t3) として解釈されました。現在は JOIN が高い優先順位を持つので、式は (t1, (t2 JOIN t3)) として解釈されます。この変更は、ON 条項が接合の演算子内のカラムだけを参照する事ができ、優先順位の変更はそれらの演算子が何であるかについての解釈を変えてしまうので、この条項を利用するステートメントに影響を与えます。
この変更により、構文bは b と c が先に結合されるため、この時点では参照されていない a のカラムを指定することが出来無くなりました。
ありがとうございます。
大変参考になりました。