HiveでOracleのMINUS関数を再現します
HiveにはOracleのMINUS関数は用意されていませんが、他の方法でMINUS操作を実装できます。
HiveのUNION ALLとLEFT JOINを使用してMINUS演算を実行する方法があります。
テーブルAとBがあり、テーブルAにあってテーブルBにないレコードを取得したい場合、次のクエリを使用できます。
SELECT A.column1, A.column2, ...
FROM A LEFT JOIN B
ON A.column1 = B.column1
WHERE B.column1 IS NULL
LEFT JOINで2つのテーブルを結合し、条件A.column1 = B.column1で結合後、WHERE句でBテーブルに一致するレコードがない、つまりB.column1 IS NULLを抽出したクエリ
なお、本手法は、2つのテーブルの構造が同じであり、1列の値のみを比較することを前提としています。複数の列の値を比較する場合は、ON句に条件を追加します。
もう1つの方法は、NOT IN句を用いてマイナス演算を行う。まず、テーブルBの特定の列の値を問い合わせ、次にNOT IN句を使用してテーブルAに一致するレコードがないものを絞り込む。
SELECT column1, column2, ...
FROM A
WHERE (column1, column2, ...) NOT IN
(SELECT column1, column2, ...
FROM B)
このクエリはまず、サブクエリでテーブルBのある列の値を問い合わせ、NOT IN句を使用してテーブルAで一致するレコードがないものをフィルタリングします。
どちらの方法でもM I N U S演算子と同じような処理が行えますが、どちらの方法を選択するかは具体的な使用目的とデータの規模に左右されます。