LEFT JOIN / INNER JOIN を実行すると同じ内容のレコードが複数含まれる

JOIN を実行すると同じ内容のレコードが複数含まれる現象について紹介します。

下記のテーブルを準備します。
Working テーブル
idnamevaluecategorymemo
1Penguin300B南国にすむペンギンです
2Whale420M北極海のクジラです
3Moffu880NULLよくわからない生き物です
4Camel220M砂漠にすむラクダです
5Owl90B関東のフクロウです
6Duck120Bそこらへんのアヒルです

WorkingCategory テーブル
idcategorynameflag
1B鳥類1
2B鳥類2
3M哺乳類1

下記のSQLを実行します。
select Working.name, Working.category, WorkingCategory.name from Working
 left join WorkingCategory on Working.category=WorkingCategory.category;
下記の結果となります。
namecategoryname
PenguinB鳥類
PenguinB鳥類
WhaleM哺乳類
MoffuNULLNULL
CamelM哺乳類
OwlB鳥類
OwlB鳥類
DuckB鳥類
DuckB鳥類
category の値がBのレコードは同じ内容のレコードが2つ含まれています。これは、WorkingCategory テーブルにcategoryの値が"B"で、flagの値が"1"と"2"のレコードの2種類があるため、それぞれが結合された結果2つの同じ値のレコードが出力されます。

inner joinを実行した場合もレコードは重複します。
select Working.name, Working.category, WorkingCategory.name from Working
 inner join WorkingCategory on Working.category=WorkingCategory.category;
namecategoryname
PenguinB鳥類
PenguinB鳥類
WhaleM哺乳類
CamelM哺乳類
OwlB鳥類
OwlB鳥類
DuckB鳥類
DuckB鳥類

対処方法:distinct を利用

出力されるフィールドの値が全く同じ場合は distinct を利用すると回避できます。
下記のSQL文を実行します。
select distinct Working.name, Working.category, WorkingCategory.name from Working
 left join WorkingCategory on Working.category=WorkingCategory.category;

結果は以下になります。
namecategoryname
CamelM哺乳類
DuckB鳥類
MoffuNULLNULL
OwlB鳥類
PenguinB鳥類
WhaleM哺乳類

inner joinの場合は下記です。
select distinct Working.name, Working.category, WorkingCategory.name from Working
 inner join WorkingCategory on Working.category=WorkingCategory.category;

結果は以下になります。
namecategoryname
CamelM哺乳類
DuckB鳥類
OwlB鳥類
PenguinB鳥類
WhaleM哺乳類

distinct文の詳細についてはこちらの記事を参照してください。

対処方法:条件を追加

条件で絞り込むことで、結合するレコードが1つになる場合は、結合条件を追加することで回避できます。on節の条件式に and を記述することで複数の条件を結合条件に設定できます。
今回の例の場合WorkingCategory テーブルのflagが1の場合に限り結合すれば、結合するレコードを1つにできます。下記のSQL文実行します。
select Working.name, Working.category, WorkingCategory.name from Working
 left join WorkingCategory on Working.category=WorkingCategory.category and WorkingCategory.flag=1;
結果は以下になります。
namecategoryname
PenguinB鳥類
WhaleM哺乳類
MoffuNULLNULL
CamelM哺乳類
OwlB鳥類
DuckB鳥類
このページのキーワード
  • LEFT JOIN 同じレコード 複数
  • INNER JOIN 同じレコード 複数
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。
掲載日: 2018-08-12
iPentec all rights reserverd.