とある在庫管理システムがあったとして、DBには4つのテーブルがあるとする。
shohin_master(商品マスタ)
maker_master(メーカーマスタ)
zaiko(在庫管理)
uriage(売上管理)
ここから、全商品に対する在庫数と売上数を抽出するVIEWを作りたかったので、以下のようなSELECT文を作ってみた。
※カラム名は実際に使っているものではなく、記事用に適当な名前をつけています
SELECT s.shohin_no, s.name, m.name, s.price, z.zaiko_num, SUM( u.uriage_num )
FROM shohin_master s, maker_master m
LEFT JOIN zaiko z ON s.shohin_no = z.shohin_no
LEFT JOIN uriage u ON z.zaiko_no = u.zaiko_no
WHERE s.shohin_no = z.shohin_no
AND s.maker_no = m.maker_no
GROUP BY z.zaiko_no;
イメージとしては、商品マスタとメーカーマスタに対して、在庫管理をLEFT JOINして、さらに売上管理をLEFT JOINしたかったのに、SELECTした結果は思い通りにはいかなかった。
つまり、
( ( shohin_master s, maker_master m ) LEFT JOIN zaiko z ) LEFT JOIN uriage u
という状況をイメージしていたのに、結果は
shohin_master s, ( maker_master m LEFT JOIN ( zaiko z LEFT JOIN uriage u ) )
となってしまっていたらしい。
どうやらMySQLでは、今までは前者で動いていたのに、いつぞやのバージョンアップ(詳しいバージョンは失念)から後者の動きになってしまったらしい?
前者のような動きをさせたかったら、明示的にカッコでくくらないといけなくなったんだとか。
そこで、FROM以降を以下のように書き換えたところ、イメージ通りの結果に。
FROM ( ( shohin_master s, maker_master m )
LEFT JOIN zaiko z ON s.shohin_no = z.shohin_no )
LEFT JOIN uriage u ON z.zaiko_no = u.zaiko_no
計算式を書くときもそうだけど、明示的にカッコでくくったほうが間違いがなくてイイヨネ。プログラムする側も、優先順位が分かりやすいし。
※記事用にSQL文を少し書き換えていますが、そのせいで破綻したものになっていたらスミマセン(笑)
コメント