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で書く例と解説でした。
コメント