ACCESS ユニオンクエリで複数のテーブルを連結する方法

ユニオンクエリで複数のテーブルを連結する方法

ACCESSで同じような列(フィールド)があるテーブルやクエリが複数できてしまうことってあると思います。
本来は同じフィールドは1つのテーブルにまとまるように設計するのが良いのですが、使いながらテーブルを修正、追加していくとどうしてもこうした事態が発生します。

そんな時に便利な、ユニオンクエリの使用方法をお教えします。


こんにちは。
はこにわガジェット (@hakoniwagadget) です。

ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは使いこなすために少しスキルが必要なものの、うまく活用すればExcelよりも業務の効率化が図れます。
この記事ではACCESSの基本的な使い方をご紹介していきます。

ユニオンクエリとは

ユニオンクエリは、複数のテーブル、クエリを結合してあたかも1つのテーブルのように見せるクエリです。

通常、ACCESSのクエリはキー値を用いて、一つの行に対して複数のテーブルを横に連結し、列を増やしていきます。
下記のようなイメージです。

ここでは、売上テーブルのデータを元に、商品ID等のキー値を用いて情報を他のテーブルから補完しています。

しかし、場合によっては同様のテーブルレイアウトで、行を増やしたい場合があります。
例えば、同じ売上でも以下の2つの条件で抽出を行ったとします。

顧客名に「もと」が含まれる売上

以下が抽出結果です。

商品名に「支援」が含まれる売上

こちらの結果は以下になります。

この抽出条件それぞれは、上記の通り選択クエリで作成することが可能です。
しかし、この2つの条件で抽出したレコードを同じテーブルの形でみたい、となると登場するのがユニオンクエリです。

ユニオンクエリでは、テーブルフォーマットの同じテーブルやクエリのレコードを統合して表示することが可能です。

ユニオンクエリの作成方法

ユニオンクエリは以下の手順で作成します。

まず、クエリをデザインビューで新規作成しましょう。
すると、上段のメニューに「ユニオン」というボタンがあります。

こちらを押すと、真っ白な画面が出てきます。

いつものクエリ作成と全然違う、と思われると思います。
そうです。
ユニオンクエリはクエリとは名がついているものの、ここにSQL文を記載していくのです。

今回は先ほど作成した2つのクエリを結合するユニオンクエリを作っていきましょう。
下記の通り記述します。


 select * from ユニオン1_顧客名 union select * from ユニオン2_商品;
 

最も基本的なSQL文の形である「SELECT * FROM テーブル/クエリ名」をUNIONでつなげただけです。
実行を押して結果を見てみましょう。

このように、2つのクエリで抽出されたレコードがまとめて表示されました。

ユニオンクエリ作成時の注意点

ユニオンクエリを作成する際に注意するのは、2つのテーブル / クエリのテーブルフォーマットを同じにすることです。
そうしないと表示ができませんのでご注意ください。

例えば、上記の例でいうと「ユニオン1_顧客名」クエリは抽出条件に顧客名を、「ユニオン2_商品」は抽出条件に商品名を利用しています。
しかし、顧客名、商品名をクエリの表示フィールドに含めてしまうと、2つのクエリで異なるフィールドが発生してしまいうまくUNIONができないのです。

また、ユニオンクエリは結局SQLで書くのであれば、最初からクエリを使わずに全てSQLで書けば済むじゃないかと思われるかもしれません。
全くその通りです。
しかし、ACCESSを使われる方の全てがSQLに精通しているわけではありません。

ユニオンクエリを使えば、途中の抽出条件まではクエリの機能を使ってGUIで設定可能です。
その上で、最後のユニオンさせる部分だけを、今回記述したようなもっとも単純なSQL文で書くことができるのです。

これであればSQLがそれほど得意でない方も十分に利用可能だと思います。

重複したレコードを表示する方法

前述のUNIONですと重複したレコードが削除されてしまいます。
重複レコードも含めてすべて表示するにはUNION ALLを使用します。

例えば、前の例ですと以下のように記述します。
UNIONの後にALLがありますね。


 select * from ユニオン1_顧客名 union all select * from ユニオン2_商品;
 

結果をデータシートビューで見てみましょう。

赤枠で囲った売上ID:13が重複していることが分かると思います。

今回の例では重複を表示する必要性はないですが、重複しても表示したい場合はUNION ALLを使用しましょう。

テーブル作成クエリとの違い

ACCESSにはテーブル作成クエリという機能があります。

こちらはクエリで指定した条件を元に、新規にテーブルを作成することが可能です。
上記のような例であれば、ユニオンクエリを使わずとも、各クエリで抽出したデータを最初の1つを元にテーブル作成クエリでテーブルを作成し、次のクエリは追加クエリで作成したテーブルに追加する方法で同じ条件のレコードを抽出したテーブルを作成することができます。

しかし、テーブルの追加、削除を繰り返すとACCESSファイルのデータ量は増えていきます。
テーブルを削除しても解放されない領域があるためです。

そういった際には、データベースの最適化/修復を行ってデータ量を圧縮することが可能です。
詳しくはこちらの記事をご覧ください。

ACCESS 最適化でデータベースの容量を圧縮する方法

上記で圧縮はできるものの、運用後も定期的にデータベースの圧縮作業を行うのは煩雑です。
できる限りデータ容量が増えない方法を選択すると、テーブルを作らずにユニオンクエリで処理したほうが良い、という結論になります。

利用シーン

実はユニオンクエリを使う場合というのは、残念ながらテーブル設計が綺麗にできていない場合が多いです。

そもそも、同じテーブルフォーマットのレコードを合わせて表示するわけですから、最初から同じテーブルにレコードが有ればよいのです。しかし、何らかの理由でテーブルを分けざるを得ず、それを再度同じテーブルのように表現したい、となった時にユニオンクエリが登場します。

なんだ。
それならテーブル設計をしっかりやればいいだけで、使わないじゃないかと思われるかもしれません。

ACCESSデータベースを新規作成するときはその通りでしょう。
新規で作成した際にユニオンクエリを使わざるを得ないような場合は、テーブル設計に不備があると言わざるを得ません。

しかし、ACCESSデータベースは日々使って運用していくものです。
長期間使って少しずつ改修を行っているとデータベースが複雑化し、既存のテーブルに修正を入れると影響が大きくなる場合があります。

そうした際にやむを得ず、正規化された状態でないテーブルを作るということは、実務上は発生するものです。

本来は使わない方がデータベースとしては美しいのですが、実運用上は使わざるを得なくなる場合もある。
ユニオンクエリはそんなものだと思っていただければと思います。

なお、テーブルの設計方法については以下の記事も参照ください。

ACCESSでテーブルを作成する方法

以上、ユニオンクエリで複数のテーブルを連結する方法をご紹介しました。


ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。

そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。

ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。

サービス一覧

最後までお読みいただき、ありがとうございました。