本記事では、Oracleで、
2つのテーブルの行の差分を抽出することができるMINUSの使い方を解説していく。
MINUS –2つのテーブルの行の差分を抽出する–
Oracleでは、MINUSを使うことで、
2つのテーブルの行の差分を抽出することが可能だ。

MINUSの使い方
MINUSの書式は以下の様になっている。
select * from テーブルA
MINUS
select * from テーブルB
テーブルAで取得した行と、テーブルBで取得した行を全ての列の値で比較し、
列の値がすべて一致する行は抽出しない。
- 抽出はテーブルAのみにある行を抽出する。
- 2つのテーブルの列数が同じであることが必要。列名は異なっていても実行可能だ。
集合演算子で、差集合を求める。
MINUSでテーブルの差分を抽出するサンプル
ではここからは実際に、
MINUS演算子を使って、2つのテーブルを比較し、差分を表示するサンプルを紹介していく。
① MINUSで差分を表示する –基本的な使い方–
サンプルデータ
1つめのpeople_mainテーブル
id | name | kana |
1 | 鈴木 | suzuki |
2 | 田岡 | taoka |
3 | 佐山 | sayama |
2つめのpeople_subテーブル。
id | name | kana |
2 | 田岡 | taoka |
以下のSQLを実行する。
select * from people_main
MINUS
select * from people_sub
抽出結果は、以下の通り。
id | name | kana |
1 | 鈴木 | suzuki |
3 | 佐山 | sayama |
people_mainテーブルのみにあるデータが表示されたのが分かるだろう。
people_mainテーブルとpeople_subテーブルに重複する行は表示されない。
② 比較するテーブルの値が異なっていた場合 –差分として抽出しない–
MINUSを使う際に、
比較するテーブルの値が異なっていた場合は、差分として抽出されない。
以下、2つのテーブルがあるとする。
1つめのpeople_mainテーブル。
2行目のデータは、列のkanaの値がnullになっている。
id | name | kana |
1 | 鈴木 | suzuki |
2 | 田岡 | NULL |
3 | 佐山 | sayama |
2つめのpeople_subテーブル。
id | name | kana |
2 | 田岡 | taoka |
以下のSQLを実行する。
select * from people_main
MINUS
select * from people_sub
抽出結果は、以下のとおり。
id | name | kana |
1 | 鈴木 | suzuki |
2 | 田岡 | NULL |
3 | 佐山 | sayama |
people_mainテーブルのデータが全件表示される。
比較する項目がnullどうしの場合 –判定可能(抽出されない)–
MINUSを使用する際、
比較する項目がnullどうしの場合でも判定可能(抽出されない)だ。
以下、2つのテーブルがあるとする。
1つめのpeople_mainテーブル。2行目のデータにnullがある。
id | name | kana |
1 | 鈴木 | suzuki |
2 | 田岡 | NULL |
3 | 佐山 | sayama |
2つめのpeople_subテーブル。こちらもNULLがある。
id | name | kana |
2 | 田岡 | NULL |
以下のSQLを実行する。
select * from people_main
MINUS
select * from people_sub
抽出結果は、以下のとおり。
id | name | kana |
1 | 鈴木 | suzuki |
3 | 佐山 | sayama |
お互いにNULLの行をもつ1行目と3行目のみ出力されたのが分かるだろう。
関連記事
https://www.shift-the-oracle.com/sql/minus-operator.html
https://docs.oracle.com/cd/F32587_01/sqlrf/The-UNION-ALL-INTERSECT-MINUS-Operators.html
Oracle以外のデータベースシステムでは、MINUSと同機能を持つものに「EXCEPT」が存在する。
MINUSと言うネームはOracle特有のものと覚えておこう。
他にも、Oracle特有のものを挙げると
他DBSMの「LIMIT」に代替することが可能な「ROWNUM」などが存在する。
記事を取得できませんでした。記事IDをご確認ください。