EXCEPTを使って複数テーブルから他方に無いレコードを抽出する
比較するテーブルの列数、型を合わせる必要がある。
例)
顧客CD(売上) | 顧客CD(顧客) |
---|---|
100 | 100 |
101 | 101 |
102 | 104 |
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(売上) |
---|---|
100 | 100 |
101 | 101 |
102 | NULL |
②顧客CDでRIGHT JOINする
顧客CD(顧客) | 顧客CD(売上) |
---|---|
100 | 100 |
101 | 101 |
NULL | 104 |
③上記で取得したNULLレコードをそれぞれ取得して統合した結果、 お互いのテーブルに存在しなかったレコードが取得できる。
顧客CD |
---|
102 |
104 |
今日はここまで。