集合演算子のUNION/UNION ALL

ORACLE
20171203-1

本記事では集合演算子のUNIONとUNION ALLについて、その使い方を解説します。

※当ページにおいて、検索結果イメージのNULLは【NULL】と表現しています。

スポンサーリンク

UNIONとは

2つの問い合わせ結果を1つの結果にまとめるのが集合演算子です。

UNIONは、その集合演算子の1つで、2つの問い合わせの結果を結合します。その際、重複行は1つにまとめます。

注意点としては、片方の問い合わせ結果内で重複があった場合も1つにまとめます。

-- テーブル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があった場合でも、同様にまとめます。

SELECT NULL a
FROM DUAL
UNION
SELECT NULL a
FROM DUAL
;

A
----
NULL
スポンサーリンク

UNION ALLとは

UNION ALLは、集合演算子の1つで、2つの問い合わせの結果を結合します。その際、重複行をまとめることなく全ての行を戻します。

-- テーブル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つの問い合わせで問い合わせで抽出項目名が異なっていてもエラーにはなりませんが、最初の問い合わせの項目名が採用されます。

SELECT 'AAA' a
FROM DUAL
UNION
SELECT 'BBB' b
FROM DUAL
;

A   ← 最初の問い合わせの項目名を採用
---
AAA
BBB

ソートは最後で指定

ソートする場合は、最後で指定します。その際指定する項目名は、最初の問い合わせで指定した項目を記述します。

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)になります。

SELECT 1 a
      ,2 b
FROM DUAL
UNION
SELECT 1 a
FROM DUAL
;

ORA-01789: 問合せブロックにある結果の列数が正しくありません

抽出項目のデータ型の種類が異なる(ORA-01790)

2つの問い合わせの抽出項目のデータ型の種類が異なる場合、実行エラー(ORA-01790)になります。

例えば、問い合わせ1が文字型で問い合わせ2が数値型といったような場合にエラーとなります。
しかし、同じ文字型であるCHARとVARCHAR2などは問題ありません。

SELECT 'AAA' a
FROM DUAL
UNION
SELECT 1 a
FROM DUAL
;

ORA-01790: 式には対応する式と同じデータ型を持つ必要があります

関連(集合演算子)


タイトルとURLをコピーしました