集合演算子 「MINUS」
2つのテーブルを比較して、マスタテーブルから引き算して差分レコードを抽出することができるのが、集合演算子である「MINUS」です。
MINUS構文
以下が、「MINUS」の基本的な構文です。
SELECT 列1, 列2,・・・ FROM <テーブル名1> MINUS SELECT 列1, 列2,・・・ FROM <テーブル名2>;
検証用のデータの用意
以下の2つのテーブルとデータを使って「MINUS」の動きを見ていきます。
id | name | address |
---|---|---|
001 | いるか | 海 |
002 | うさぎ | 陸 |
003 | ぺんぎん | 空 |
004 | いるか | 海 |
id | name | address |
---|---|---|
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」オプションは使えないはずです。。。!残念(´・ω・`)
コメント