【SQL】テーブルの差分を取得する 「EXCEPT」を使用して差集合を簡単に取得できる
EXCEPTを使って複数テーブルから他方に無いレコードを抽出する 

比較するテーブルの列数、型を合わせる必要がある。

例)

顧客CD(売上)顧客CD(顧客)
100100
101101
102104
SELECT 顧客CD FROM 売上
EXCEPT
SELECT 顧客CD FROM 顧客

売上テーブルにあって、顧客テーブルに存在しないレコードは、

顧客CD(売上)
102
SELECT 顧客CD FROM 顧客
EXCEPT
SELECT 顧客CD FROM 売上

顧客テーブルにあって、売上テーブルに存在しないレコードは、

顧客CD(顧客)
104

差分を統合して、差分結果とする。

SELECT * 
  FROM (SELECT 顧客CD FROM 顧客
        EXCEPT
        SELECT 顧客CD FROM 売上
       )A
 UNION ALL
SELECT * 
  FROM (SELECT 顧客CD FROM 売上
        EXCEPT
        SELECT 顧客CD FROM 顧客
       )B

統合した結果:

顧客CD
102
104


EXCEPTを使わないで差分を取得する場合は

テーブルの外部結合時に、結合条件に一致しないレコードがNULLになることを利用して差分を取得する。

例えば、LEFT JOINで結合し、左テーブルに存在して、右テーブルに存在しないレコード(NULL)を取得する。次に、RIGHT JOINで結合し、右テーブルに存在して、左テーブルに存在しないレコード(NULL)を取得する。

上記の結果を統合すると、EXCEPTと同等の結果を得ることができる。

SELECT * FROM 顧客
         LEFT JOIN 売上
           ON 顧客.顧客CD = 売上.顧客CD
        WHERE 売上.顧客CD IS NULL
UNION ALL
SELECT * FROM 顧客
        RIGHT JOIN 売上
           ON 顧客.顧客CD = 売上.顧客CD
        WHERE 顧客.顧客CD IS NULL

例)

①顧客CDでLEFT JOINする  

顧客CD(顧客)顧客CD(売上)
100100
101101
102NULL

②顧客CDでRIGHT JOINする

顧客CD(顧客)顧客CD(売上)
100100
101101
NULL104

③上記で取得したNULLレコードをそれぞれ取得して統合した結果、 お互いのテーブルに存在しなかったレコードが取得できる。

顧客CD
102
104


今日はここまで。