SQLのMINUS演算子で差分を抽出するサンプルです。
目次
| 説明 | MINUS演算子(2つのテーブルの行の差分を抽出する) | 
| サンプル | MINUSを使用したサンプル | 
| 比較するテーブルの値が異なっていた場合 | |
| 比較する項目がnullどうしの場合 | 
MINUS演算子(2つのテーブルの行の差分を抽出する)
| select * from テーブルA MINUS select * from テーブルB | 
- テーブルAで取得した行とテーブルBで取得した行を全ての列の値で比較し、列の値がすべて一致する行は抽出しません。
 →テーブルAのみにある行を抽出します。
 →2つのテーブルの列数が同じであることが必要です。列名は異なっていても実行できます。
- 集合演算子で、差集合を求めます。
- 「MINUS」はOracleの演算子です。似た演算子として「EXCEPT」演算子があります。
 https://itsakura.com/sql-except
- 以下は、Oracleの集合演算子のリンクです。
 https://docs.oracle.com/cd/E16338_01/server.112/b56299/queries004.htm
MINUSを使用したサンプル
MINUS演算子で2つのテーブルを比較し、差がある行を表示するサンプルです。
以下、2つのテーブルがあるとします。
| id | name | romaji | 
|---|---|---|
| 1 | 鈴木 | suzuki | 
| 2 | 田中 | tanaka | 
| 3 | 佐藤 | sato | 
| id | name | romaji | 
|---|---|---|
| 2 | 田中 | tanaka | 
MINUSを使用したSQLを実行します。
select * from employee 
MINUS
select * from employee_before結果は、以下のとおりです。
| id | name | romaji | 
|---|---|---|
| 1 | 鈴木 | suzuki | 
| 3 | 佐藤 | sato | 
employeeテーブルのみにあるデータが表示されます。
employeeテーブルとemployee_beforeテーブルに重複する行は表示されません。
比較するテーブルの値が異なっていた場合
比較するテーブルの値が異なっていた場合は、差分として抽出されません。
以下、2つのテーブルがあるとします。
| id | name | romaji | 
|---|---|---|
| 1 | 鈴木 | suzuki | 
| 2 | 田中 | NULL | 
| 3 | 佐藤 | sato | 
2行目は、列のromajiの値がnullです。
| id | name | romaji | 
|---|---|---|
| 2 | 田中 | tanaka | 
MINUSを使用したSQLを実行します。
select * from employee 
MINUS
select * from employee_before結果は、以下のとおりです。
| id | name | romaji | 
|---|---|---|
| 1 | 鈴木 | suzuki | 
| 2 | 田中 | NULL | 
| 3 | 佐藤 | sato | 
employeeテーブルのデータが全件表示されます。
比較する項目がnullどうしの場合
比較する項目がnullどうしの場合でも判定できます。
以下、2つのテーブルがあるとします。
| id | name | romaji | 
|---|---|---|
| 1 | 鈴木 | suzuki | 
| 2 | 田中 | NULL | 
| 3 | 佐藤 | sato | 
2行目のデータにnullがあります。
| id | name | romaji | 
|---|---|---|
| 2 | 田中 | NULL | 
こちらもNULLがあります。
MINUSを使用したSQLを実行します。
select * from employee 
MINUS
select * from employee_before結果は、以下のとおりです。
| id | name | romaji | 
|---|---|---|
| 1 | 鈴木 | suzuki | 
| 3 | 佐藤 | sato | 
1,3行目のみ出力されます。
関連の記事
SQL UNIONとUNION ALLのサンプル(結合して抽出)
SQL INTERSECTのサンプル(一致行を抽出する)
