【SQL】JOINで複数の条件を書くには

SQLのJOINで複数の条件を書く

SQLの「JOIN」について解説します。SQL Serverの「JOIN」は複数のテーブルを条件をつけてJOIN(結合)できます。

ここではLEFT JOINを例に複数の結合条件をつけてJOIN(結合)してみます。

サンプルデータ

emp

empno empname
A001 佐藤花子
A002 田中太郎
A003 加藤一
A004 青木花
A005 藤田学

tokyo_aut

empno pos_f
A001 0
A005 1
A010 0

osaka_aut

empno pos_f
A001 1
A002 0
A009 0

例1. LEFT JOINで複数条件をつける

--LEFT JOINの結合
SELECT e.empno, e.empname, t.empno tokyo
FROM emp e 
 LEFT JOIN tokyo_aut t ON e.empno = t.empno AND pos_f = 1
WHERE e.empno < 'A100'
;
e.empno e.empname tokyo
A001 佐藤花子
A002 田中太郎
A003 加藤一
A004 青木花
A005 藤田学 A005

複数の条件をLEFT JOINで結合する例をみていきます。

結合するテーブル

2つのテーブル「emp」「tokyo_aut」をLEFT JOINで外部結合しました。「emp」は別名「e」を、「tokyo_aut」は別名「t」をつけました。

→「FROM emp e LEFT JOIN tokyo_aut t

複数の条件

JOIN(結合)する条件は2つでした。 →「on e.empno = t.empno AND pos_f = 1」

  • 1つ目の条件: 2つのテーブルで「empno」が一致するレコード
  • 2つ目の条件: 「tokyo_aut」テーブルの「pos_f=1」のレコード

複数の結合条件を書くには、このようにON句で条件をANDでつなげていきます。

例2. LEFT JOINで複数テーブルを結合する

--LEFT JOINの結合
SELECT e.empno, e.empname, t.empno tokyo, o.empno osaka
FROM emp e 
 LEFT JOIN tokyo_aut t ON e.empno = t.empno
 LEFT JOIN osaka_aut o ON e.empno = o.empno 
WHERE e.empno < 'A100'
;
e.empno e.empname tokyo osaka
A001 佐藤花子 A001 A001
A002 田中太郎 A002
A003 加藤一
A004 青木花
A005 藤田学 A005

複数のテーブルをLEFT JOINで結合する例をみていきます。

JOIN(結合)するテーブル

3つのテーブル「emp」「tokyo_aut」「osaka_aut」をLEFT JOINで外部結合しました。

  • 1つ目の結合: 「emp」テーブルと「tokyo_aut」テーブル
  • 2つ目の結合: 「emp」テーブルと「osaka_aut」テーブル

1つ目の結合では「emp」と「tokyo_aut」を結合しました。2つ目の結合では「emp」「tokyo_aut」を結合しました。

複数のテーブルを結合するには、このようにLEFT JOINをつなげていきます。

複数の条件

結合する条件は2つのテーブルで「empno」が一致するレコードです。

  • 1つ目の条件: 「emp」「tokyo_aut」テーブルの「empno」が一致するレコード
  • 2つ目の条件: 「emp」「osaka_aut」テーブルの「empno」が一致するレコード

複数のテーブルをJOIN(結合)するポイントは、ON句でのどのテーブルと結合するか?ですね。そこで結合するテーブルの順番を変えるとどうなるか?例3で解説します。

例3. LEFT JOINで複数テーブルを結合する(結合順を入れ替える)

--LEFT JOINの結合
SELECT e.empno, e.empname, t.empno tokyo, o.empno osaka
FROM emp e 
 LEFT JOIN tokyo_aut t ON e.empno = t.empno
 LEFT JOIN osaka_aut o ON t.empno = o.empno 
WHERE e.empno < 'A100'
;
e.empno e.empname tokyo osaka
A001 佐藤花子 A001 A001
A002 田中太郎
A003 加藤一
A004 青木花
A005 藤田学 A005

例2の結果と変わってきました。結合するときはテーブルの順番に注意する必要がありますね。

複数テーブルのJOIN(結合)はテーブルに注意する

ここで注意すべきことは、JOIN(結合)するテーブルの順番です。

  • 1つ目のJOIN(結合): 「emp」テーブルと「tokyo_aut」テーブル
  • 2つ目のJOIN(結合): 「tokyo_aut」テーブルと「osaka_aut」テーブル

例2では「osaka_aut(C)」テーブルは「emp(A)」テーブルとJOIN(結合)しました。これはいいと思います。(※A:emp、B:tokyo_aut、C:osaka_aut)

例3では「osaka_aut」と「tokyo_aut」をJOIN(結合)しました。結合する順番が変わったことにより、「osaka_aut」の「A002」が表示されなくなってしまいました。

これは「emp」と「osaka_aut」のJOIN(結合)が「tokyo_aut」経由になってしまったためです。図でみるとわかりやすいと思います。「emp(A)」と「osaka_aut(C)」のみの一致が除外されてしまいました。

このようにJOIN(結合)はテーブルの順番や、どのテーブルと結合するか?に注意してSQLを書かないといけません。

以上、JOINで複数の条件をSQLで書く例と解説でした。

コメント