SQL 外部結合で片方のテーブルのみにある行を抽出

SQLの外部結合で片方のテーブルのみのデータ行を抽出するサンプルです。

目次

サンプル 左のテーブルのみにあるデータを抽出する
  どちらかのテーブルのみにある行を抽出する

左のテーブルのみにあるデータを抽出する

select
  項目
from テーブルA
   left outer join テーブルB
on
   結合する条件
where
    テーブルBのキー項目=null
  • left outer joinを使用します。outer(外部)のjoin(結合)です。
  • where句でテーブルB(抽出しない方)のキー項目にnullを指定します。

左のテーブルのみにあるデータを抽出する例

次の2つのテーブルがあるとします。
1つめのsyain1テーブルです。

syain1テーブル
id name
1 鈴木
2 田中
3 佐藤

2つめのsyain2テーブルです。

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のサンプル(結合して抽出)

△上に戻る