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

差集合。下図のテーブル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;


差分があるので、同じ要素のテーブルとは言えない。
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は差分なし。
テーブル同士の比較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。
集合指向っぽくてとても良き。