ray88’s diary

お仕事で困ったとき用の自分用の覚書

SQL UNION句(複数テーブルから取り出したデータを結合する)

①列の数とデータ型は等しくする
 UNION演算子によって結合される結果セットの列数とそれぞれの列のデータ型は等しくなければならない。
 ※片方の結果にしかない列を結合したい場合はもう片方の列の結果にダミー列としてNULLを加える必要がある。→このページの一番下のサンプルコード2参照

②ORDER BY句は最後に記述する
 UNION演算子を利用した場合、必ずしも統合される同じ列に対して同じ列名が付けられているとは限らないため、列指定は列番号(1,2)で指定する。ちなみに番号によるソートキーの指定はUNION演算子を使用しない場合でも利用が可能。

③UNION ALL 演算子の方が早い
 UNION演算子では両テーブル上に重複データが存在する場合、これを除去したうえで結果を出力するため、DB内部でソートをかけるためパフォーマンスが低下する。両テーブルに重複があっても問題ない場合は重複データも全て出力するUNION ALL演算子を使用した方が早い。
※DISTINCTキーワード、GROUP BY句、INTERSECT演算子等を利用した場合も暗黙のソート処理が発生する。

■サンプルコード1

	SELECT
		u.l_name_kana
		,u.f_name_kana
	FROM
		usr AS u
UNION
	SELECT
		e.l_name_kana
		,e.f_name_kana
	FROM
		employee as e
ORDER BY
	1,2
;

f:id:ray88:20210703084653p:plain
f:id:ray88:20210703084909p:plain
f:id:ray88:20210703085122p:plain
■サンプルコード2

SELECT
		u.l_name_kana
		,u.f_name_kana
		,NULL
	FROM
		usr AS u
UNION
	SELECT
		e.l_name_kana
		,e.f_name_kana
		,e.sex
	FROM
		employee as e
ORDER BY
	1,2
;

f:id:ray88:20210703091528p:plain