2009-03-31 8 views
0

5.0.12以降、MySQLはSQL2003標準と一致するように左結合の構文を変更しました。5.0.12変更後のMySQL LEFT JOIN - クエリの書き換え方法

... FROM (t1 , t2) LEFT JOIN t3 ON (expr 

またはそうでなければ今... FROM t1 , (t2 LEFT JOIN t3 ON (expr))

として解析されるように書き換えることにとても

... FROM t1 , t2 LEFT JOIN t3 ON (expr) 

ニーズ、私は、私は、MySQL 3.23(EEK!)からの移植だ古代のアプリを持っています5.1に、古いコードは、このクエリを持っています

select b.*, c.*, g.*, p.perfname, p.persname 
from bookings b, customer c 
left join grade g on b.chrggrade=g.grcode 
left join person p on b.person=p.percode 
where complete='Y' and invoiced='N' 
and datemade between '2009-03-25' and '2009-03-31' 
and c.custcode=b.cust 
order by cust, person, tsref, stdt 

これは、SQLエラー1054で失敗し、不明b.chrggradeの列。これは、次のように解析しているためです

選択b。 、c。、g。*、p.perfname、p.persname予約bから、(顧客c 左の参加グレードgのb.chrggrade = g.grcode) 左の参加者pのb.person = p.percode 完了= 'Y'と請求書= 'N' と '2009-03-25'と '2009-03-31' との間のdatemadeとc.custcode = b.cust cust、person、tsref、stdtによる注文

だと思います。

ブラケットが正しく取り付けられていることがわかりましたが、私は困惑しています。 この変更の参照はhttp://bugs.mysql.com/bug.php?id=13551にありますが、これは単純な左結合を修正する方法を示していますが、このクエリではまだ解決できません。 David

答えて

4

カンマ構文を使用して、JOIN文で明示的に使用を中止してください。コンマ構文では、JOIN条件をWHERE句に入れる必要があります。これは、LEFT/RIGHTが結合されるまで実行されない可能性があります。これは、構文解析の仕方によって異なります。明示的なJOINSを使用すると、問合せはよりわかりやすくなります。 T1から

...、T2のLEFTは (expr)はON T3をJOIN なる... T1 INNER FROM(expr)は左側にT2をJOIN(expr)はON T3をJOIN

もエラーを修正することあなたは見ている。予約テーブルにchrggradeがないかぎり、エラーを修正するものはありません。