SQL 片方のTableのみにある行を抽出(LEFT JOIN)

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)を抽出します。

employee1テーブル
id name
1 suzuki
2 tanaka
3 sato
employee2テーブル
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)を抽出します。

employee1テーブル
id name
1 suzuki
2 tanaka
3 sato
employee2テーブル
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のサンプル(結合して抽出)

△上に戻る