#706 ユニオンクエリのUNIONとUNION ALLの違い クエリ

『ユニオンクエリ』は、2つ以上の選択クエリ(SELECT文で構成されたクエリ)のSQL文をSQLビュー上で列挙して記述することで、その結果をあたかも1つのテーブルのように出力してくれるクエリです。同じフィールド名は同じひとつの列として出力しますので、1つ1つのクエリを上下に繋げて統合してくれるイメージです。

2つ以上のSQL文をユニオンクエリとして統合するには、各SELECTを使ったSQL文を「UNION」句で繋げて記述します。その際、『UNION』と記述した場合と、『UNION ALL』と記述した場合とで、(テーブルのデータにもよりますが)出力結果が違ってきます。ここでは、それらの違いを説明します。

■元となる2つのテーブル



■「UNION」とだけ記述した場合
   SQL文:

SELECT ID, 商品コード, [1月], [2月], [3月], [4月], [5月], [6月] FROM tbl販売実績2020
UNION
SELECT ID, 商品コード, [1月], [2月], [3月], [4月], [5月], [6月] FROM tbl販売実績2021

   デザインビュー:

   出力結果:


■「UNION ALL」と記述した場合
   SQL文:

SELECT ID, 商品コード, [1月], [2月], [3月], [4月], [5月], [6月] FROM tbl販売実績2020
UNION ALL
SELECT ID, 商品コード, [1月], [2月], [3月], [4月], [5月], [6月] FROM tbl販売実績2021

   デザインビュー:

   出力結果:


2つの結果を比較すると、出力されたレコード数自体が違っていることが分かります。元のテーブルはいずれもレコード数は5件ですので、単純に繋げただけであれば10件出力されてよいはずです。

これが「UNION」と「UNION ALL」の大きな違いになります。

「UNION」は統合されたすべてのレコードを見渡して、出力されたすべてのフィールドの値がまったく同じレコードがあれば、重複した他のレコードを除外し、それらの1つだけを出力します。
上記の例では、商品コードが”AA”、”BB”、”CC”のレコードは6月までについてはまったく同じ内容ですので、それらは一方のレコードの分しか出力されません。よって、「5 + 5 - 3」で7件のレコードだけが出力されることになります。

一方、「UNION ALL」はそのような重複をチェックしません。
ですので、内容が同じであっても、単純に繋げられた10件がそのまま出力されます。


また、「並び順」にも違いがあります。

元のテーブルは「ID」が主キーになっているのですが、「UNION」ではどちらのテーブルのレコードかに関わらず、統合後のレコードがそのフィールドで4、4、5、5のように並べ替えられていることが分かります。

「UNION ALL」ではそのような並べ替えは行われず、上部に1つのめのテーブルのレコード、下部に2つめのテーブルのレコードというように、単純に上下に繋げられて出力されています。そのため「ID」列は1〜5が繰り返されていることが分かります。


なお、「UNION」で重複レコードが除外されるのは、元のテーブルの全フィールドが同じかどうかではなく、ユニオンクエリの各SELECT文で出力されたフィールドだけがチェック対象となります。
そのため、下記の例のように出力フィールドを変えることでまた異なる結果となります。

■出力する「月」を変えた場合
   SQL文:

SELECT ID, 商品コード, [7月], [8月], [9月], [10月], [11月], [12月] FROM tbl販売実績2020
UNION
SELECT ID, 商品コード, [7月], [8月], [9月], [10月], [11月], [12月] FROM tbl販売実績2021

   出力結果:


■各テーブルごとに異なる演算フィールドを追加した場合
   SQL文:

SELECT 2020 AS 年, ID, 商品コード, [1月], [2月], [3月], [4月], [5月], [6月] FROM tbl販売実績2020
UNION
SELECT 2021 AS 年, ID, 商品コード, [1月], [2月], [3月], [4月], [5月], [6月] FROM tbl販売実績2021

   出力結果:
| Index | Prev | Next |

この情報は参考になりましたか?、問題は解決しましたか?、もしまだなら......
T'sWareのワンポイトテクニカルアドバイスをご利用ください。3000円/件〜でご支援します。
スタンドアロンからSQL Server対応まで、オーダーメイドのシステムを短納期・安価でお届けします


Copyright © T'sWare All rights reserved