#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 |
|||
|
Copyright © T'sWare All rights reserved |