本記事では集合演算子のMINUSについて、その使い方を解説します。
※当ページにおいて、検索結果イメージのNULLは【NULL】と表現しています。
MINUSとは
2つの問い合わせ結果を1つの結果にまとめるのが集合演算子です。
MINUSは、その集合演算子の1つで、1つ目の問い合わせには存在するが、2つ目の問い合わせには存在しないデータを抽出します。
注意点としては、1つ目の問い合わせに重複があった場合、1つにまとめられます。
-- テーブル1
A B
--- ---
001 AAA ← テーブル1とテーブル2に存在
002 BBB ← テーブル1のみに存在
003 CCC ← テーブル1のみに存在(重複)
003 CCC ← テーブル1のみに存在(重複)
-- テーブル2
A B
--- ---
001 AAA ← テーブル1とテーブル2に存在
004 DDD ← テーブル2のみに存在
005 EEE ← テーブル2のみに存在(重複)
005 EEE ← テーブル2のみに存在(重複)
-- 1つ目の問い合わせには存在するが、
-- 2つ目の問い合わせには存在しないデータを抽出(MINUS)
SELECT a
,b
FROM test_table1
MINUS
SELECT a
,b
FROM test_table2
;
A B
--- ---
002 BBB ← 1つ目の問い合わせには存在し、2つ目の問い合わせには存在しないデータを抽出
003 CCC ← 重複行は1つにまとめている
NULLも問題なく処理できます。
NULLが1つ目の問い合わせの結果が存在、2つ目の問い合わせには存在しない場合は、NULLが抽出されます。
また、NULLが両方の問い合わせに存在する場合は、NULLは抽出されません。
SELECT NULL a FROM DUAL MINUS SELECT '1' a FROM DUAL ; A ---- NULL
SELECT NULL a FROM DUAL MINUS SELECT NULL a FROM DUAL ; レコードが選択されませんでした。
使用時の注意点
集合演算子では、以下の2点に注意して使いましょう。比較的馴染みのあるUNIONやUNION ALLと同じです。
抽出時の項目名は最初の問い合わせを採用
2つの問い合わせで問い合わせで抽出項目名が異なっていてもエラーにはなりませんが、最初の問い合わせの項目名が採用されます。
SELECT 'AAA' a FROM DUAL MINUS SELECT 'BBB' b FROM DUAL ; A ← 最初の問い合わせの項目名を採用 --- AAA
ソートは最後で指定
ソートする場合は、最後で指定します。その際指定する項目名は、最初の問い合わせで指定した項目を記述します。
SELECT 'AAA' a FROM DUAL MINUS SELECT 'BBB' b FROM DUAL ORDER BY a ; A --- AAA
エラーになるケース2つ
集合演算子では、以下の2つのケースで実行エラーとなります。こちらもUNIONやUNION ALLと同じです。
抽出項目数が異なる(ORA-01789)
2つの問い合わせの抽出項目数が異なる場合、実行エラー(ORA-01789)になります。
SELECT 1 a
,2 b
FROM DUAL
MINUS
SELECT 1 a
FROM DUAL
;
ORA-01789: 問合せブロックにある結果の列数が正しくありません
抽出項目のデータ型の種類が異なる(ORA-01790)
2つの問い合わせの抽出項目のデータ型の種類が異なる場合、実行エラー(ORA-01790)になります。
例えば、問い合わせ1が文字型で問い合わせ2が数値型といったような場合にエラーとなります。
しかし、同じ文字型であるCHARとVARCHAR2などは問題ありません。
SELECT 'AAA' a FROM DUAL MINUS SELECT 1 a FROM DUAL ; ORA-01790: 式には対応する式と同じデータ型を持つ必要があります
関連(集合演算子)



