30代半ばの事務職員がITエンジニアになった話

おおよそタイトルのとおり、30代半ばにしてITエンジニアのタマゴになってしまった会社員の話

【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 」の
条件に原因があることが
ほとんどな気がします。