(Oracle) UNION, UNION ALLでテーブルを結合する

(Oracle) UNION, UNION ALLでテーブルを結合する

 

本記事では、Oracleで、
複数のSELECT結果を統合することができるUNIONとUNION ALLの使い方を紹介する。

 

UNION、UNION ALL –複数のSELECT結果を統合する–

Oracleでは「UNION」もしくは「UNION ALL」を使用することで、
複数のSELECT結果を統合(和集合)することが可能だ。

sqlのUNIONとUNION ALLのイメージ図
参考:INTERSECT

UNIONと似た機能を持つINTERSECTはよく混同してしまうが、
こちらはテーブルの共通部分だけを取得する関数となっている。

記事を取得できませんでした。記事IDをご確認ください。

 

UNION、UNION ALLの使い方

UNION、UNION ALLの書式は以下のようになる

--UNION
テーブルA
UNION
テーブルB

--UNION ALL
テーブルA
UNION ALL
テーブルB

 

UNION,UNION ALLはいわゆる和集合だ。
ザックリいうと、「テーブルA+テーブルB」のようなイメージになる。

 

注意点としては、
UNIONで結合する際はテーブルの列は同じ数でないといけないと言う決まりがある。

上記の理由から、実際は既存のテーブル同士を結合するよりも、SELECT文でカラムを一致させた結果同士を結合すると言う使い方が主となるだろう。

 

UNIONとUNION ALLの違い

UNIONとUNION ALLの違いは以下となる

 

UNIONとUNION ALLの違い

UNION  :統合の結果、重複レコードは1行にまとめられる

UNION ALL:統合の結果、重複レコードは重複したまま表示される

 




 

UNION, UNION ALLでテーブルを統合するサンプル

ではここからは実際に、
UNION、UNION ALLを使ってテーブル同士を統合するサンプルを紹介していく。

サンプルに使うデータは以下の様なものとする。

--テーブルA
SELECT id,name FROM table_a;
id name
11 たろう
22 しんのすけ
44 りこ

 

--テーブルB
SELECT id,name FROM table_b;
id name
5 けんいち
8 マイケル
44 りこ

 

① UNIONで2つのテーブルを統合する

以下はUNIONを使ってテーブルAとテーブルBを統合させた結果だ。

SELECT id,name FROM table_a
UNION
SELECT id,name FROM table_b
order by id;

 

実行結果

id name
5 けんいち
8 マイケル
11 たろう
22 しんのすけ
44 りこ

 

UNIONを使用することで、別テーブル同士のSELECT結果をまとめて表示することが可能だ。
その際、重複レコードである「44、りこ」のレコードは1行にまとめられて表示されているのが分かるだろう。

上の例ではテーブルは2つだけだったが、2つ以上の複数のテーブルを統合することも可能だ。

 

② UNION ALLで2つのテーブルを統合する

以下はUNION ALLを使ってテーブルAとテーブルBを統合させた結果だ。

SELECT id,name FROM table_a
UNION ALL
SELECT id,name FROM table_b
order by id;

 

実行結果

id name
5 けんいち
8 マイケル
11 たろう
22 しんのすけ
44 りこ
44 りこ

 

UNION ALLを使用することで、重複レコードを重複したまま統合して表示することが可能だ。

重複レコードである「44、りこ」のレコードが2行そのまま表示されているのが分かるだろう。

 

まとめると、

  • 重複をそのまま取得したい場合はUNION ALL、
  • 重複を排除したい場合はUNION

を使用すると良いだろう。

 

 

関連記事

(Oracle) MERGEでテーブルの更新と追加を行う
(Oracle) INTERSECTでテーブル同士の重複行を取得する

 

https://www.shift-the-oracle.com/sql/union-operator.html

https://docs.oracle.com/cd/E17952_01/mysql-8.0-ja/union.html

 

記事が気に入った方はシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。