(Oracle) MINUSでテーブルの差分を抽出する

(Oracle) MINUSでテーブルの差分を抽出する

 

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

 

MINUS  –2つのテーブルの行の差分を抽出する–

Oracleでは、MINUSを使うことで、
2つのテーブルの行の差分を抽出することが可能だ。

oracleのMINUSのイメージ画像
EXCEPT

Oracle以外のデータベースシステムでは、MINUSと同機能を持つものに「EXCEPT」が存在する。
MINUSと言うネームはOracle特有のものと覚えておこう。

他にも、Oracle特有のものを挙げると
他DBSMの「LIMIT」に代替することが可能な「ROWNUM」などが存在する。

記事を取得できませんでした。記事IDをご確認ください。

 

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行目のみ出力されたのが分かるだろう。

 

関連記事

(Oracle) UNION, UNION ALLでテーブルを結合する
(Oracle) INTERSECTでテーブル同士の重複行を取得する

 

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

 

 

記事が気に入った方はシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。