Accessユニオンクエリについてお探しですね。
広告
Accessユニオンクエリの使い方を分かりやすく解説!複数テーブルを縦に結合する方法
Accessで仕事をしていると、「年度別」「店舗別」「担当者別」に分かれた同じ形式のテーブルを、1つの一覧にまとめて見たいことってよくありますよね。
普通のクエリはテーブル同士を横につなげて列を増やすのが基本ですが、**ユニオンクエリ**を使えば、複数のテーブルを縦方向に積み重ねて、まるで1つの表のように扱えるんです。
この記事では、Accessのユニオンクエリって何なのか、どうやって作るのか、UNIONとUNION ALLの違いは何か、エラーを防ぐにはどうすればいいかまで、初心者の方にも分かりやすく説明していきます。
ユニオンクエリって何?複数のテーブルを縦につなげる便利な機能
Accessの**ユニオンクエリ**とは、複数のテーブルやクエリのデータを縦方向につなげて、1つの結果表として見せてくれるクエリのことです。
例えば、「2023年売上」テーブルと「2024年売上」テーブルが同じ列の構成で別々に分かれているとしましょう。
ユニオンクエリを使えば、この2つの売上データをまとめた一覧を簡単に作れます。
元のテーブルそのものを結合して新しいテーブルを作るわけじゃなくて、クエリを実行したときだけ統合した結果を表示してくれるのがポイントです。
普通の選択クエリでは、商品IDや顧客IDなんかをキーにして、売上テーブルに商品名や顧客名を横方向に付け足していきますよね。
それに対してユニオンクエリは、同じような列を持つデータを上から下へ積み上げていくイメージです。
つまり、横に列を増やすんじゃなくて、**縦に行を増やす**ためのクエリだと考えると分かりやすいと思います。
実際の仕事では、こんな場面で役立ちます:
– 年度ごとに分かれた売上データをまとめたい
– 支店ごとに送られてきた顧客リストを1つにしたい
– 分類別に作られた同じ形式の明細データを統合したい
本当は、同じ性質のデータは1つのテーブルにまとめて管理するのが理想的なんですが、長年使っているAccessだと、改修の経緯や部署ごとのルールでテーブルが分かれちゃってることもありますよね。
そんなときに、既存の構造を大きく変えずに一覧化できるのが、ユニオンクエリの大きなメリットなんです。
それと、ユニオンクエリはテーブルだけじゃなくて、選択クエリ同士をつなげることもできます。
例えば「顧客名に特定の文字を含む売上」と「商品名に特定の文字を含む売上」をそれぞれ普通のクエリで作っておいて、その結果をユニオンクエリでまとめる、なんてこともできるんです。
SQLに慣れてなくても、抽出条件まではデザインビューで作って、最後に結果を縦に統合する部分だけSQLで書く、という使い方ができるので安心してください。
ユニオンクエリの作り方:SQLビューで複数テーブルをつなげよう
Accessでユニオンクエリを作るときは、いつものクエリデザイン画面でフィールドをドラッグして…という方法じゃなくて、**SQLビューにSQL文を直接入力**します。
手順はこんな感じです:
1. 「作成」タブから「クエリデザイン」を開く
2. テーブルの追加画面が出てきたら、何も選ばずに閉じる
3. クエリの種類から「ユニオン」を選ぶ
4. SQLを入力する画面に切り替わる
基本の書き方はとってもシンプルで、各テーブルからデータを取ってくるSELECT文を、UNIONでつなげるだけです。
例えば、同じ列構成の「売上2023」と「売上2024」を縦につなげるなら、こう書きます:
“`sql
SELECT * FROM 売上2023
UNION
SELECT * FROM 売上2024;
“`
「SELECT *」っていうのは、対象テーブルの全部のフィールドを取ってくるよ、という意味です。
2つのテーブルのフィールド数や並び順が完全に同じなら、この書き方でOKです。
ただ、テーブル名にスペースが入ってたり、数字から始まる名前だとエラーになることがあるので、Accessでは角かっこを使って `[2023年売上]` みたいに囲んでおくと安全です。
必要なフィールドだけを指定してまとめることもできます。
例えば、売上ID、売上日、顧客名、金額だけをまとめたいなら、こんな感じ:
“`sql
SELECT 売上ID, 売上日, 顧客名, 金額 FROM 売上2023
UNION
SELECT 売上ID, 売上日, 顧客名, 金額 FROM 売上2024;
“`
ここで大事なのは、**各SELECT文で指定するフィールドの数と順番をそろえる**ことです。
Accessのユニオンクエリでは、フィールド名が完全に同じじゃなくてもいいんですが、1列目には1列目、2列目には2列目のデータが対応します。
だから、片方では「顧客名」、もう片方では「取引先名」っていう名前でも、同じ意味のデータなら同じ位置に指定すればちゃんと統合できます。
結果に表示されるフィールド名は、基本的に**最初のSELECT文で指定したフィールド名**になります。
別の名前で表示したいときは、AS句を使って別名を付けられます。
例えば「納入先ID」と「仕入先ID」をどっちも「ID」として表示したいなら、最初のSELECT文で `納入先ID AS ID` って書けばOKです。
レポートやフォームのデータ元として使う予定があるなら、後から見て分かりやすいフィールド名になるように、最初のSELECT文の名前を整えておくと管理しやすくなりますよ。
UNIONとUNION ALLの違い、抽出条件やフィールド名変更の書き方
ユニオンクエリでよく混同されるのが、**UNIONとUNION ALL**の違いです。
– **UNION**:結合結果の中で完全に重複するレコードは1件にまとめる
– **UNION ALL**:重複を取り除かず、元データのレコードを全部そのまま表示する
例えば、同じ顧客情報が複数のテーブルに入っていて、重複のない顧客一覧を作りたいときはUNIONが向いています。
でも、売上明細や作業履歴みたいに、たとえ同じ日付・同じ金額・同じ顧客でも、それぞれのレコードに意味があるデータなら**UNION ALL**を使うべきです。
UNIONで重複が削除されちゃうと、本当は残すべき明細が消えたように見えちゃう可能性があるからです。
処理速度の面でも違いがあります。
UNIONは重複を判定する処理が入るので、データ件数が多いほど重くなりやすいんです。
UNION ALLは重複チェックをしないから、単純にデータを積み上げたいだけならこっちの方が効率的です。
実務では、はっきり「重複を除外したい」っていう目的がある場合だけUNIONを使って、それ以外はUNION ALLを検討するといいでしょう。
“`sql
SELECT 売上ID, 売上日, 顧客名, 金額 FROM 売上2023
UNION ALL
SELECT 売上ID, 売上日, 顧客名, 金額 FROM 売上2024;
“`
抽出条件を付ける
ユニオンクエリでは、各SELECT文に個別の抽出条件を付けることもできます。
例えば、2023年データからは金額が10,000円以上の売上だけ、2024年データからは特定の顧客だけを取り出して結合する、なんてこともできるんです。
普通の選択クエリと同じようにWHERE句が使えるので、結合前に不要なデータを絞り込めます。
“`sql
SELECT 売上ID, 売上日, 顧客名, 金額 FROM 売上2023
WHERE 金額 >= 10000
UNION ALL
SELECT 売上ID, 売上日, 顧客名, 金額 FROM 売上2024
WHERE 顧客名 Like “*株式会社*”;
“`
並べ替えをする
並べ替えをしたいときは、各SELECT文の途中じゃなくて、**ユニオンクエリ全体の最後**にORDER BY句を書きます。
例えば売上日順に並べたいなら、最後に `ORDER BY 売上日;` を追加すればOKです。
複数のテーブルを統合した結果全体に対して並べ替えるので、ORDER BYは最後に1回だけ指定するのが基本です。
エラーを防ぐ注意点と、他のクエリとの使い分け
よくあるエラーと対策
Accessユニオンクエリで一番多いエラーは、**結合するSELECT文同士でフィールドの数が合ってない**ケースです。
1つ目のSELECT文で4列を指定したなら、2つ目以降のSELECT文でも必ず4列を指定する必要があります。
元テーブルの列数が違っても、SELECTで取り出す列数をそろえればユニオンクエリは作れます。
次に注意したいのが、**フィールドの順序とデータ型**です。
ユニオンクエリではフィールド名じゃなくて、指定した順番で列が対応します。
だから、1つ目のSELECT文の1列目が売上日なのに、2つ目のSELECT文の1列目に顧客名を指定しちゃうと、意味の違うデータが同じ列に混ざっちゃいます。
また、同じ位置にあるフィールドのデータ型が大きく違うと、Accessが型を解釈できなくてエラーになったり、変な表示になったりすることがあります。
確認すべきポイントは、この3つです:
– **各SELECT文で指定するフィールド数をそろえる**
– **同じ意味のフィールドが同じ順番になるように並べる**
– **日付型、数値型、短いテキスト型など、同じ位置のデータ型をできるだけそろえる**
もし片方のテーブルにだけあるフィールドを結果に含めたいときは、足りない側にダミーの列を追加します。
例えば「備考」フィールドが売上2024にしかないなら、売上2023側には `Null AS 備考` を指定することで列数を合わせられます。
これで、古い年度のデータでは備考が空欄、新しい年度のデータでは備考が表示される統合結果が作れます。
“`sql
SELECT 売上ID, 売上日, 顧客名, 金額, Null AS 備考 FROM 売上2023
UNION ALL
SELECT 売上ID, 売上日, 顧客名, 金額, 備考 FROM 売上2024;
“`
追加クエリ・テーブル作成クエリとの使い分け
ユニオンクエリと似た目的で使われる機能に、**追加クエリ**や**テーブル作成クエリ**があります。
– **追加クエリ**:あるテーブルのデータを別のテーブルに実際に追加する
– **テーブル作成クエリ**:クエリ結果をもとに新しいテーブルを作る
どちらも実際のデータを作成・変更するので、後から集計用テーブルとして固定したいときには便利です。
一方、**ユニオンクエリは元のテーブルを変更せず、実行時に統合結果を表示するだけ**です。
だから、試しに複数テーブルを一覧化してみたいときや、常に最新の元データを反映した一覧を見たいときに向いています。
また、テーブルを作ったり削除したりしないので、Accessファイルの容量が無駄に増えにくいのも実務上の利点です。
Accessって不要なテーブルを削除してもファイルサイズがすぐに小さくならないことがあるので、定期的な最適化の手間を減らす意味でも、ユニオンクエリで済む処理はユニオンクエリでやる価値があります。
ユニオンクエリに頼りすぎないことも大切
ただし、ユニオンクエリを使えばいいってもんでもありません。
同じ構造のテーブルが年度別や支店別に大量に分かれてる場合、本当は「年度」や「支店コード」のフィールドを持つ**1つのテーブルに統合した方が管理しやすい**こともあります。
新しくデータベースを設計する段階なら、ユニオンクエリに頼る前にテーブル設計を見直すべきです。
既存システムの制約がある場合はユニオンクエリで柔軟に対応して、将来的にはテーブル正規化やリレーションシップ設計の見直しにつなげると、もっと運用しやすいAccessデータベースになりますよ。
まとめ
ユニオンクエリは、分かれたテーブルを手軽にまとめられる便利な機能です。
SQLを直接書く必要がありますが、基本の形はシンプルなので、ぜひ試してみてくださいね!
広告
