SQLのLeft Joinで片方のテーブルのみにあるデータ行を抽出するサンプルです。
目次
サンプル | 左のテーブルのみにあるデータを抽出する |
どちらかのテーブルのみにある行を抽出する |
左のテーブルのみにあるデータを抽出する
select 項目 from テーブルA left outer join テーブルB on 結合する条件 where テーブルBのキー項目=null |
- left outer joinを使用します。outer(外部)のjoin(結合)です。
- where句でテーブルB(抽出しない方)のキー項目にnullを指定します。
左のテーブルのみにあるデータを抽出する例
次の2つのテーブルがあり、employee1テーブルのみにある行(id=1)を抽出します。
id | name |
---|---|
1 | suzuki |
2 | tanaka |
3 | sato |
id | name |
---|---|
2 | tanaka |
3 | sato |
4 | takeda |
上記テーブルに対してleft outer joinを使用してデータを抽出します。
SELECT
s1.id,
s1.name
FROM employee1 s1
left outer join employee2 s2
on
s1.id = s2.id
where
s2.id is null;
5行目のleft outer joinでemployee1テーブルの全行が抽出対象になります。
9行目は、employee2テーブルのidがnullの行を指定しています。
(step1) 9行目がない場合は、以下になります。
s1.id | s1.name | s2.id | s2.name |
---|---|---|---|
1 | suzuki | null | null |
2 | tanaka | 2 | tanaka |
3 | sato | 3 | sato |
(step2) 9行目のs2.id is nullの指定で以下の結果になります。
id | name |
---|---|
1 | suzuki |
employee1テーブルのみにある行が抽出されました。
どちらかのテーブルのみにある行を抽出する
どちらかのテーブルのみにある行を抽出するサンプルです。
次の2つのテーブルがあり、employee1テーブルのみにある行(id=1)とemployee2テーブルのみにある行(id=4)を抽出します。
id | name |
---|---|
1 | suzuki |
2 | tanaka |
3 | sato |
id | name |
---|---|
2 | tanaka |
3 | sato |
4 | takeda |
「左のテーブルのみにあるデータを抽出する例」をUnionで組み合わせます。
select A1.id,A1.name from
(SELECT
s1.id as id,
s1.name as name
FROM employee1 s1
left outer join employee2 s2
on
s1.id = s2.id
where
s2.id is null) A1
union
select A2.id,A2.name from
(SELECT
s2.id as id,
s2.name as name
FROM employee2 s2
left outer join employee1 s1
on
s1.id = s2.id
where
s1.id is null) A2
;
1~10行目は、ひとつめのSQLです。employee1テーブルのみにある行を抽出します。
11行目は、unionです。結果を結合します。
13~21行目は、ふたつめのSQLです。employee2テーブルのみにある行を抽出します。
結果は、以下のとおりです。
id | name |
---|---|
1 | 鈴木 |
4 | 竹田 |
employee1テーブルとemployee2テーブルにのみある行(id=1と4)が抽出されました。
関連の記事
SQL 外部結合のサンプル(LEFT OUTER JOIN)
SQL UNIONとUNION ALLのサンプル(結合して抽出)