[MySQL] LEFT JOINがうまく動かない…?

※当サイトでは広告を掲載しています

とある在庫管理システムがあったとして、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文を少し書き換えていますが、そのせいで破綻したものになっていたらスミマセン(笑)

コメント

タイトルとURLをコピーしました