【SQL】検索結果の数値が2倍になる(重複)件について
ITエンジニアといえば
データベース = SQL
というイメージが強いです。
そんなわけで、
IT要員に転向する前から
ヒマな時間に遊んでいま
日々習得にはげんでおりました。
日頃、SQLをつかう上で
ためになったことを
備忘録の意味も込めて
記したいと思います。
計算結果が倍になる
SQL文を書いていて
計算結果が正しい数値の
2倍(もしくは3~倍)
になる事象が発生することが
あるのですが、
原因の傾向がみえてきました。
商品コードと分類と売上額のテーブル A と、
商品コードと分類と商品名のテーブル B
を結合させることを想定します。
テーブル A テーブル B コード | 分類 | 売上 コード | 分類 | 商品名 001 | 果物 | 300 001 | 果物 | りんご 002 | 果物 | 200 002 | 果物 | バナナ 003 | 野菜 | 100 003 | 野菜 | トマト
このときに、
分類だけわかればいいから
商品コードは検索結果に含めなくてていいや
と思って、次のようなSQLにすると
SELECT A.分類, B.商品名, A.売上 FROM A LEFT JOIN B ON A.分類 = B.分類;
検索結果は見事に重複することになります。
分類 | 商品名 | 売上 果物 | りんご | 300 果物 | りんご | 300 果物 | バナナ | 200 果物 | バナナ | 200 野菜 | トマト | 100
1~2行目でいうと
テーブル Aの1行目の分類は果物だぞ
テーブル Bの分類から果物を探せ
↓
テーブル Bで果物が2つ見つかったから
検索結果は2行返してきているわけですね。
なので、正しく表示させるには
結合の条件にコードをいれてあげます。
SELECT A.分類, B.商品名, A.売上 FROM A LEFT JOIN B ON A.コード = B.コード AND A.分類 = B.分類;
検索結果が5行くらいなら
一目瞭然なのですが、
これが10,000行とかになると
何が起こったか理解できず
何度ハマったことか。。
というわけで、
この手のエラーは
たいがい「 JOIN 」の
条件に原因があることが
ほとんどな気がします。