okinawa

ITと英語の勉強メモがメイン

【SQL】テーブル同士の比較

テーブル動詞の比較1(EXCEPT)

EXCEPT

差集合。下図のテーブル5とテーブル6で試してみる。

テーブル5
テーブル6

「A EXCEPT B」と「B EXCEPT A」のSQLを実行して、両方とも結果がNULLなら同じ要素のテーブルと言える。

--table5 - table6
SELECT * FROM test.table5
EXCEPT ALL
SELECT * FROM test.table6;

--table6 - table5
SELECT * FROM test.table6
EXCEPT ALL
SELECT * FROM test.table5;

table5 - table6の結果
table6 - table5の結果

差分があるので、同じ要素のテーブルとは言えない。

ALLなしは重複排除

ALLなしにすると重複排除した上で比較する。

※ALL付けたほうがパフォーマンスは良いので、可能な場合は付けること。

--table5 - table6
SELECT * FROM test.table5
EXCEPT
SELECT * FROM test.table6;

--table6 - table5
SELECT * FROM test.table6
EXCEPT
SELECT * FROM test.table5;

table5 - table6の結果
table6 - table5の結果

重複排除したtable5とtable6は差分なし。

テーブル同士の比較2(UNION・INTERSECT)

テーブル同士が等しいか異なるかを集合演算子で華麗に比較する方法。

もしテーブルAとテーブルBが完全に等しければ、UNIONの結果とINTERSECTの結果も等しい。

もしテーブルAとテーブルBが異なれば、UNIONの方がINTERSECTより必ず大きくなる。


↑真ん中が完全に等しいとき。

   元テーブル(classb classd classe)

・classBとclassDで比較

select
case when count(*) = 0
     then '等しい'
     else '異なる'
end result
 from((
SELECT * FROM classb
union 
SELECT * FROM classd
)
except
(
select * from classb
intersect
SELECT * FROM classd
)) as inte

結果:異なる

・classBとclassEで比較

select
case when count(*) = 0
     then '等しい'
     else '異なる'
end result
 from((
SELECT * FROM classb
union 
SELECT * FROM classe
)
except
(
select * from classb
intersect
SELECT * FROM classe
)) as inte

結果:等しい

テーブルの中身を一切知らなくても比較できるSQL
集合指向っぽくてとても良き。

参考書籍

達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ(ミック)|翔泳社の本