2017/12/07
本記事では集合演算子のUNIONとUNION ALLについて、その使い方を解説します。
※当ページにおいて、検索結果イメージのNULLは【NULL】と表現しています。
sponsored link
UNIONとは
2つの問い合わせ結果を1つの結果にまとめるのが集合演算子です。
UNIONは、その集合演算子の1つで、2つの問い合わせの結果を結合します。その際、重複行は1つにまとめます。
注意点としては、片方の問い合わせ結果内で重複があった場合も1つにまとめます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
-- テーブル1 A B --- --- 001 AAA ← テーブル1とテーブル2に存在 002 BBB ← テーブル1内で重複 002 BBB ← テーブル1内で重複 -- テーブル2 A B --- --- 001 AAA ← テーブル1とテーブル2に存在 003 CCC -- 問い合わせの結果を結合(UNION) SELECT a ,b FROM test_table1 UNION SELECT a ,b FROM test_table2 ; A B --- --- 001 AAA ← 重複行は1つにまとめている 002 BBB ← 重複行は1つにまとめている 003 CCC |
2つの問い合わせの両方にNULLがあった場合でも、同様にまとめます。
1 2 3 4 5 6 7 8 9 10 |
SELECT NULL a FROM DUAL UNION SELECT NULL a FROM DUAL ; A ---- NULL |
UNION ALLとは
UNION ALLは、集合演算子の1つで、2つの問い合わせの結果を結合します。その際、重複行をまとめることなく全ての行を戻します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
-- テーブル1 A B --- --- 001 AAA ← テーブル1とテーブル2に存在 002 BBB ← テーブル1の中で重複 002 BBB ← テーブル1の中で重複 -- テーブル2 A B --- --- 001 AAA ← テーブル1とテーブル2に存在 003 CCC -- 問い合わせの結果を結合(UNION ALL) SELECT a ,b FROM test_table1 UNION SELECT a ,b FROM test_table2 ; A B --- --- 001 AAA ← 重複をまとめない 002 BBB ← 重複をまとめない 002 BBB ← 重複をまとめない 001 AAA ← 重複をまとめない 003 CCC |
UNIONとUNION ALLの違いと使い分け
UNIONとUNION ALL、両方とも2つの問い合わせの結果を結合する集合演算子ですが、重複行をまとめるかどうかで差異があります。
UNIONはまとめて、UNION ALLはまとめません。
目的に合わせて使用しますが、どちらでもよい場合は、UNION ALLを使用します。重複行をまとめる必要がない分、処理時間が若干早いです。
使用時の注意点
UNIONとUNION ALLをはじめとした集合演算子では、以下の2点に注意して使いましょう。
抽出時の項目名は最初の問い合わせを採用
2つの問い合わせで問い合わせで抽出項目名が異なっていてもエラーにはなりませんが、最初の問い合わせの項目名が採用されます。
1 2 3 4 5 6 7 8 9 10 11 |
SELECT 'AAA' a FROM DUAL UNION SELECT 'BBB' b FROM DUAL ; A ← 最初の問い合わせの項目名を採用 --- AAA BBB |
ソートは最後で指定
ソートする場合は、最後で指定します。その際指定する項目名は、最初の問い合わせで指定した項目を記述します。
1 2 3 4 5 6 7 8 9 10 11 12 |
SELECT 'AAA' a FROM DUAL UNION SELECT 'BBB' b FROM DUAL ORDER BY a ; A --- AAA BBB |
エラーになるケース2つ
UNIONとUNION ALLをはじめとした集合演算子では、以下の2つのケースで実行エラーとなります。
抽出項目数が異なる(ORA-01789)
2つの問い合わせの抽出項目数が異なる場合、実行エラー(ORA-01789)になります。
1 2 3 4 5 6 7 8 9 |
SELECT 1 a ,2 b FROM DUAL UNION SELECT 1 a FROM DUAL ; ORA-01789: 問合せブロックにある結果の列数が正しくありません |
抽出項目のデータ型の種類が異なる(ORA-01790)
2つの問い合わせの抽出項目のデータ型の種類が異なる場合、実行エラー(ORA-01790)になります。
例えば、問い合わせ1が文字型で問い合わせ2が数値型といったような場合にエラーとなります。
しかし、同じ文字型であるCHARとVARCHAR2などは問題ありません。
1 2 3 4 5 6 7 8 |
SELECT 'AAA' a FROM DUAL UNION SELECT 1 a FROM DUAL ; ORA-01790: 式には対応する式と同じデータ型を持つ必要があります |
関連(集合演算子)