はじめに
システムの移行等を行うと、新旧でテーブルデータの一致確認を行うことがありますが、Oracle環境下では MINUS演算子を使用して検証を行っていました。しかし、MINUS演算子はOracle SQL独自の演算子であるためOracle以外の環境では使用できません。
BigQueryで同様の関数があるのか調べたところ、BigQueryではEXCEPT DISTINCTで、MINUS演算子と同様の検証が出来ることが分かったので、ご紹介します。
EXCEPT DISTINCTの説明
複数のSELECT結果の差(差集合)を取得する関数で、先に書かれている SELECT 文の結果レコードから、後に書かれている SELECT 文の結果レコードを引き算し、差のあるレコードが抽出されます。
テーブルデータの一致確認を行う場合は、双方向で確認を行います。
EXCEPT DISTINCTの文法
SELECT * FROM TABLE_A
EXCEPT DISTINCT
SELECT * FROM TABLE_B
上記では、TABLE_AとTABLE_Bの全てのカラムで比較を行い、TABLE_Aのみに存在するレコードを抽出します。
テーブルデータの比較
パターン① データ不一致
◆データ
以下の例では「店CD = '003'」のレコードは「旧_店別売上データ」テーブルにのみに存在しています。
また、「店CD = '004'」のレコードは「新_店別売上データ」テーブルにのみに存在しています。
◆SQL実行&結果
以下のクエリを実行します。クエリ結果として「旧_店別売上データ」のみに存在するレコードが出力されます。
次に以下のクエリを実行します。クエリ結果として「新_店別売上データ」のみに存在するレコードが出力されます。
パターン② データ一致
◆データ
以下は2つのテーブルに格納されているデータが一致する場合の例になります。
◆SQL実行&結果
テーブルデータに差異がないため、どちらのクエリ結果も該当データなしとなります。
【注意点】同値行が存在する場合
テーブル設計上、同値行が存在することはないと思いますが、同値行は差として出力されないので注意が必要です。
制約がないテーブルで一致確認をする場合は、件数の一致確認後にEXCEPT DISTINCTで確認をすることをお勧めします。
→同値行は差として出力されないので、出力なし。
さいごに
テーブル比較EXCEPT DISTINCTの使い方について、実際の例とともに詳しく見てきました。
今回は説明のため単方向ずつSQLを実行しましたが、データが一致していることが前提であれば、副問い合わせを使用し1SQLで実行すると良いかと思います。