UNION と UNION ALL 集合演算子
UNION 集合演算子とは複数の SELECT 文を1つに組み合わせる演算子である。
複数の問い合わせを1つに結合することから、それぞれの問い合わせの抽出項目のリストは同数、かつ、同じグループの データ型 でなければ結合することができない。
簡単な UNION のサンプル
UNION ALL
UNION ALL :2つの問い合わせ結果のレコードが 同じ内容であっても重複行も含める 結果にする
SELECT 1, 2 FROM DUAL
UNION ALL
SELECT 1, 2 FROM DUAL;
1 2
---------- ----------
1 2
1 2
UNION
UNION :2つの問い合わせ結果のレコードが 同じ内容であった場合、重複行は削除して 結果にする (≒ SQL の DISTINCT 処理)
SELECT 1, 2 FROM DUAL
UNION
SELECT 1, 2 FROM DUAL;
1 2
---------- ----------
1 2
UNION できない例
項目数の不一致
SELECT 1, 2 FROM DUAL
UNION ALL
SELECT 1, 2, 3 FROM DUAL;
-- リストの項目数が合わない
行1でエラーが発生しました。:
ORA-01789: 問合せブロックにある結果の列数が正しくありません
データ型の不一致
SELECT 1 FROM DUAL
UNION ALL
SELECT SYSDATE FROM DUAL;
-- 数値と日付を UNION ALL
行1でエラーが発生しました。:
ORA-01790: 式には対応する式と同じデータ型を持つ必要があります
UNION した後の並び替え
UNION 結合した後でデータを並び替えるときに困っている場合には項目別名を使用すると良い(※)。
というのも集合演算子を使用するケースではリストの項目名が異なっている場合やファンクションを
使用していることが多い。そのときには項目に別名をつけて、その別名で並び替えを行なう。
(注意) それぞれの問い合わせで異なる別名を付けているだけではエラーにならないが最初の別名だけが有効で
2番目の別名は使用できない。
(※) 列番号を使用しても良いが後々に発生するであろうメンテナンスを考慮すると別名を使用した方が良いだろう。
SELECT 'あいう' "ONE", 'さしす' "TWO" FROM DUAL
UNION ALL
SELECT 'いうえ' "ONE_ONE", 'かきく' "TWO_TWO" FROM DUAL
ORDER BY ONE, TWO ;
...
結果省略
SELECT 'あいう' "ONE", 'さしす' "TWO" FROM DUAL
UNION ALL
SELECT 'いうえ' "ONE_ONE", 'かきく' "TWO_TWO" FROM DUAL
ORDER BY ONE_ONE, TWO_TWO ;
行4でエラーが発生しました。:
ORA-00904: "ONE_ONE": 無効な識別子です。
SELECT 'あいう' , 'さしす' FROM DUAL
UNION ALL
SELECT 'いうえ' "ONE", 'かきく' "TWO" FROM DUAL
ORDER BY ONE, TWO ;
ORA-00904: "ONE": 無効な識別子です。
UNION ALL と更新可能なビュー
UNION [ALL] / INTERSECT / MINUS 集合演算を使用したビューは更新できないビューとなる。
ORA-01732: このビューではデータ操作が無効です というエラーになる。
標準SQL では更新が認められるようになっている UNION ALL 集合演算子による結合においても現在のところ(Oracle 10g) 更新できないビューになっている。
SQL - UNION ALL 関連