Oracle MINUS 集合演算子 2つのテーブルの差分レコードを抽出する方法

スポンサーリンク

集合演算子 「MINUS」

2つのテーブルを比較して、マスタテーブルから引き算して差分レコードを抽出することができるのが、集合演算子である「MINUS」です。

MINUS構文

以下が、「MINUS」の基本的な構文です。

SELECT 列1, 列2,・・・ FROM <テーブル名1>
MINUS
SELECT 列1, 列2,・・・ FROM <テーブル名2>;

検証用のデータの用意

以下の2つのテーブルとデータを使って「MINUS」の動きを見ていきます。

ANIMAL1テーブル
idnameaddress
001いるか
002うさぎ
003ぺんぎん
004いるか
ANIMAL2テーブル
idnameaddress
001いるか
002うさぎ
005ふくろう

イメージを掴むためにベン図を書いてみました。

検証用データのSQL

--animal1テーブル作成
CREATE TABLE animal1
(
    id       VARCHAR2(10)
    ,name    VARCHAR2(20)
    ,address VARCHAR2(20)
);

--animal2テーブル作成
CREATE TABLE animal2
(
    id       VARCHAR2(10)
    ,name    VARCHAR2(20)
    ,address VARCHAR2(20)
);

--データの作成
INSERT ALL
INTO animal1 VALUES('001', 'いるか', '海')
INTO animal1 VALUES('002', 'うさぎ', '陸')
INTO animal1 VALUES('003', 'ぺんぎん', '空')
INTO animal1 VALUES('004', 'いるか', '海')
INTO animal2 VALUES('001', 'いるか', '海')
INTO animal2 VALUES('002', 'うさぎ', '陸')
INTO animal2 VALUES('005', 'ふくろう', '空')
SELECT * FROM dual;

検証用データの実行結果

SQL> CREATE TABLE animal1
  2  (
  3      id       VARCHAR2(10)
  4      ,name    VARCHAR2(20)
  5      ,address VARCHAR2(20)
  6  );

表が作成されました。

SQL> CREATE TABLE animal2
  2  (
  3      id       VARCHAR2(10)
  4      ,name    VARCHAR2(20)
  5      ,address VARCHAR2(20)
  6  );

表が作成されました。

SQL> INSERT ALL
  2  INTO animal1 VALUES('001', 'いるか', '海')
  3  INTO animal1 VALUES('002', 'うさぎ', '陸')
  4  INTO animal1 VALUES('003', 'ぺんぎん', '空')
  5  INTO animal1 VALUES('004', 'いるか', '海')
  6  INTO animal2 VALUES('001', 'いるか', '海')
  7  INTO animal2 VALUES('002', 'うさぎ', '陸')
  8  INTO animal2 VALUES('005', 'ふくろう', '空')
  9  SELECT * FROM dual;

7行が作成されました。

MINUSの実行例

先に書いた方のテーブルがマスタテーブルとなってそのマスタテーブルを基準に差し引きして差分レコードを抽出します。

MINUSのSQL

以下のSQLを実行してみましょう。

SELECT id, name ,address FROM animal1
MINUS
SELECT id, name ,address FROM animal2;

MINUSの実行結果

SQL> SELECT id, name ,address FROM animal1
  2  MINUS
  3  SELECT id, name ,address FROM animal2;

ID    NAME       ADDRESS
----- ---------- ----------
003   ぺんぎん   空
004   いるか     海

想定どおりのレコードが取得できていますね\(^o^)/

MINUSの注意点

冒頭でも記述したように「MINUS」はマスターとなるテーブルから差し引きして差分を抽出します。このことからマスターとなるテーブルを入れ替えると結果が変化します。

マスタテーブルを入れ替えてMINUSの実行結果

SQL> SELECT id, name ,address FROM animal2
  2  MINUS
  3  SELECT id, name ,address FROM animal1;

ID    NAME       ADDRESS
----- ---------- ----------
005   ふくろう   空

想定どおりのレコードが取得できていますね\(^o^)/

「ALL」オプションについて

ちなみに、「ALL」オプションを付与することで重複行を取得するようにできる集合演算子もあります。「MINUS」演算子についてもOracle以外のDBMSだと「ALL」オプション使えるものもあるみたいです。

現在検証で使っているOracleの11g時点では「MINUS」に「ALL」オプションは使えないはずです。。。!残念(´・ω・`)

コメント

タイトルとURLをコピーしました