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