MINUS 集合演算子

MINUS 演算子は複数の SELECT 文を1つに組み合わせて 先に書かれている SELECT 文の結果レコードから 次に書かれている SELECT 文の結果レコードを引き算する演算子である。(重複行は1つにまとめられる)

複数の問い合わせの差分を抽出することから、それぞれの問い合わせの抽出項目のリストは同数、かつ、同じグループの データ型 でなければ集合演算することができないのは UNION [ALL] や INTERSECT と同様である。

他の DBMS では MINUS という演算子ではなく EXCEPT が使用されることもある。

簡単な MINUS のサンプル

MINUS

MINUS:MINUS の前の結果セット(レコードの集まり)から MINUS の後続の結果セットを取り除く。重複行は1つにまとめられる。

SELECT 1, 2 FROM DUAL
UNION
SELECT 2, 3 FROM DUAL
MINUS
SELECT 1, 2 FROM DUAL;
 
         1          2
---------- ----------
         2          3

SQL の内容: レコード [1 , 2] と [2 , 3] が UNION した後に [1 , 2] を MINUS している ⇒ 集合演算子のルールと制限
{ [1 , 2], [2 , 3] } - { [1 , 2] } = { [2 , 3] }

MINUS できない例

項目数の不一致

SELECT 1, 2 FROM DUAL
MINUS
SELECT 1, 2, 3 FROM DUAL;
-- リストの項目数が合わない
行1でエラーが発生しました。:
ORA-01789: 問合せブロックにある結果の列数が正しくありません

データ型の不一致

SELECT 1 FROM DUAL
MINUS
SELECT SYSDATE FROM DUAL;
-- 数値と日付を INTERSECT
行1でエラーが発生しました。:
ORA-01790: 式には対応する式と同じデータ型を持つ必要があります

MINUS した後の並び替え

MINUS 集合演算した後でデータを並び替えるときに困っている場合には項目別名を使用すると良い。
(注意) それぞれの問い合わせで異なる別名を付けているだけではエラーにならないが最初の別名だけが有効で 2番目の別名は使用できない。

  • 別名は最初の定義のみが有効
SELECT 'あいう' "ONE", 'さしす' "TWO" FROM DUAL
UNION ALL
SELECT 'かきく' "ONE", 'たちつ' "TWO" FROM DUAL
MINUS
SELECT 'あいう' "ONE_ONE", 'さしす' "TWO_TWO" FROM DUAL
ORDER BY ONE, TWO ;
...
結果省略
  • 後続の別名は無効になる
SELECT 'あいう' "ONE", 'さしす' "TWO" FROM DUAL
UNION ALL
SELECT 'かきく' "ONE", 'たちつ' "TWO" FROM DUAL
MINUS
SELECT 'あいう' "ONE_ONE", 'さしす' "TWO_TWO" FROM DUAL
ORDER BY ONE_ONE, TWO_TWO ;
 
行4でエラーが発生しました。:
ORA-00904: "ONE_ONE": 無効な識別子です。
  • 後続の問い合わせだけに別名を付けても無効になる
SELECT 'あいう' , 'さしす' FROM DUAL
MINUS
SELECT 'あいう' "ONE", 'さしす' "TWO" FROM DUAL
ORDER BY ONE, TWO ;
 
ORA-00904: "ONE": 無効な識別子です。


関連事項

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle のライセンスがわからない…
Oracle Direct (ネットで聞いても最後はここで要確認)