ExcelVBA・SQL|UNIONを使って複数のテーブルを結合させる方法

エクセルVBA VBAでSQL



SQL文で2つのテーブルを1つに結合させるためには「UNION」を使います。

ですが、「UNION」は「UNION ALL」もあり、いまいち違いや使いどころが難しいという声も聞かれます。

今回はSQL文の「UNION」について

  • UNIONとUNION ALLの違い。
  • 2つのテーブルを1つに結合させる。
  • 3つ以上の複数テーブルを1つに結合させる。

について徹底的に解説していきますね☆



ExcelVBA・SQL|UNIONを使って複数のテーブルを結合させる方法

「UNION」は使いどころが難しいと言われています。

よく質問があるのは「UNIONをどうやって使えばよいのかわからない」という声。

まずは最初に「UNION」と「UNION ALL」の違いについて説明します。

UNION ALL とは?UNIONとUNION ALLの違い

複数のテーブルを統合し、1つのテーブルにするには「UNION」または「UNION ALL」を使用します。

結合させる際に、「UNION」と「UNION ALL」の違いは、重複データを含めるかどうかです。

  • UNION:重複データを含めない(重複があったら除外)
  • UNION ALL:重複データを含む(すべて抽出)

これは以下の図のように和集合になります(AのテーブルとBのテーブルの結合)。

つまり、テーブルAとテーブルBを結合した場合は、以下のようになります。

  • UNION:テーブルAとテーブルBの重複データを含めない(重複データは除外)
  • UNION ALL:テーブルAとテーブルBの重複データも含む(すべて抽出)

これが「UNION」を使うべきか「UNION ALL」を使うべきか、明確な使いどころの違いになります。

UNION・UNION ALLを使って2つのテーブルを1つに結合させる

まず「UNION」の構文を見てみましょう。

▶2つのテーブルを1つに結合するUNIONの構文

SELECT フィールド名 FROM テーブル名1
UNION
SELECT フィールド名 FROM テーブル名2

次の例では、2つのテーブル「商品マスタ」と「通販マスタ」について、フィールド「商品名」と「価格」を抽出して1つのテーブルに結合してみます。

【2つのテーブル】

【1つのテーブル「結合」に結合する】

【VBAにおけるUNIONを使ったSQL文】

vSQL = "SELECT * INTO 結合 from ("   '1つに結合させるためにテーブル「結合」を作る
vSQL = vSQL & "SELECT 商品名,価格 "
vSQL = vSQL & "FROM 商品マスタ "
vSQL = vSQL & "ORDER BY 商品名 ASC "
vSQL = vSQL & "UNION "

vSQL = vSQL & "SELECT 商品名,価格 "
vSQL = vSQL & "FROM 通販マスタ "
vSQL = vSQL & ");"

【実行結果】

「UNION」で結合したので、重複したデータは除外されています。

重複したデータを除外しない場合は「UNION ALL」を使います。

▶2つのテーブルを1つに結合するUNION ALLの構文

SELECT フィールド名 FROM テーブル名1
UNION ALL
SELECT フィールド名 FROM テーブル名2

構文的には、「UNION」を「UNION ALL」 に置き換えているだけです。

先ほどの2つのテーブルを「UNION ALL」で1つに結合させると、実行結果は以下のように重複データを含んだものになります。

【VBAにおけるUNION ALLを使ったSQL文】

vSQL = "SELECT * INTO 結合 from ("   '1つに結合させるためにテーブル「結合」を作る
vSQL = vSQL & "SELECT 商品名,価格 "
vSQL = vSQL & "FROM 商品マスタ "
vSQL = vSQL & "ORDER BY 商品名 ASC "
vSQL = vSQL & "UNION ALL "

vSQL = vSQL & "SELECT 商品名,価格 "
vSQL = vSQL & "FROM 通販マスタ "
vSQL = vSQL & ");"

【実行結果】

「UNION ALL」で結合したので、重複したデータは除外されず重複したまま1つのテーブルに結合されます。

UNION・UNION ALLを使って3つ以上の複数テーブルを1つに結合させる

3つ以上の複数テーブルを1つのテーブルに結合させる場合は「UNION」を以下のように使います。

▶3つ以上の複数テーブルを1つに結合するUNIONの構文

SELECT フィールド名 FROM テーブル名1
UNION
SELECT フィールド名 FROM テーブル名2
UNION
SELECT フィールド名 FROM テーブル名3
UNION
SELECT フィールド名 FROM テーブル名4
・・・

以上のように結合したいテーブルをUNIONでつないでいきます。

具体的には、以下のように記述します。

【VBAにおける3つ以上のテーブルを結合するUNIONを使ったSQL文】

vSQL = "SELECT * INTO 結合 from ("

vSQL = vSQL & "SELECT 商品名,価格 "
vSQL = vSQL & "FROM 商品マスタ "
vSQL = vSQL & "ORDER BY 商品名 ASC "

vSQL = vSQL & "UNION "
vSQL = vSQL & "SELECT 商品名,価格 "
vSQL = vSQL & "FROM 通販マスタ "

vSQL = vSQL & "UNION "
vSQL = vSQL & "SELECT 商品名,価格 "
vSQL = vSQL & "FROM 譲渡マスタ "
vSQL = vSQL & ");"

「UNION ALL」を使う場合は、「UNION」を「UNION ALL」に置き換えてSQL文を記述してくださいね。

まとめ

今回は2つ以上の複数テーブルを1つのテーブルに結合させるために「UNION」「UNION ALL」について解説しました。

「UNION」と「UNION ALL」の違いは以下のとおりです。

  • UNION:重複データを含めない(重複があったら除外)
  • UNION ALL:重複データを含む(すべて抽出)

2つのテーブルを1つに結合させるには、以下のように記述します。

SELECT フィールド名 FROM テーブル名1 
UNION 
SELECT フィールド名 FROM テーブル名2

3つ以上の複数テーブルを1つに結合させるには、以下のように記述します。

SELECT フィールド名 FROM テーブル名1 
UNION 
SELECT フィールド名 FROM テーブル名2 
UNION 
SELECT フィールド名 FROM テーブル名3 
UNION 
SELECT フィールド名 FROM テーブル名4 
・・・

UNIONを使うことが出来れば、最初に複数テーブルを1つにまとめてから以降の処理をすることが可能になりますので、処理をしやすくなるというメリットがあります。

今回の記事がUNIONの使い方の参考になれば幸いです☆




VBAでSQL
ブイサバ【Excel VBAサバイバル】~とりあえずここに来れば解決できる~

コメント

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