🎵
2つのSQLの結果が一致する事を確認する方法
概要
SQLのクエリを修正したり、リファクタリングしたりする時に、結果が変わらないことを担保したい時に用いる方法の一つを紹介します。結果をCSVでダウンロードせずに、SQLエディタ上でリファクタリングしたい時に、使ってみたい方法です。
差集合とは?
差集合は、2つのSELECT文の結果を比較し、片方にのみ存在するレコードを返す集合演算です。
SQLの標準機能として広くサポートされています。
PostgreSQLやSQL ServerではEXCEPTキーワードを使います。
一方、MySQLではMINUS、Oracleではマイナス記号(-)を使うので注意が必要です。
やり方
SQLをリファクタリングする際は、修正前と修正後のクエリで同じ結果が得られるはずです。
- 修正前のクエリをexceptの左側、修正後のクエリを右側に配置
- 左右を入れ替えてもう一度except
- 両方の差集合が空なら、修正前後のクエリは等価
具体的なイメージはこんな感じです。
-- 修正前のクエリ
(SELECT * FROM users WHERE age >= 20)
EXCEPT
-- 修正後のクエリ
(SELECT * FROM users WHERE age BETWEEN 20 AND 120);
-- 左右を入れ替えて再度チェック
(SELECT * FROM users WHERE age BETWEEN 20 AND 120)
EXCEPT
(SELECT * FROM users WHERE age >= 20);
差集合が空でない場合は、リファクタリングによって結果が変わってしまったことを示しているので、修正内容を再確認する必要があります。
Discussion