【Access】ユニオンクエリで結合テーブル作成【UNION】

スポンサーリンク
Access
スポンサーリンク

今回は、テーブルやクエリを結合するユニオンクエリの使い方を紹介します。

SQLが苦手な方は、
「小技)SQLが分からなくても大丈夫!ミスなく簡単にユニオンクエリを作成する方法」
も合わせてご覧になってください。

スポンサーリンク

ユニオンクエリとは

ユニオンクエリは、テーブルやクエリを結合することができるクエリです。
それ以上でもそれ以下でもありませんが、 使えると非常に便利なクエリです。

例えば、実際の業務では
AというテーブルとBというテーブルがあった際に、
途中の処理は違うけど最終的に同じデータの構造にして結合させるとき等に使ったりします。

テーブルの結合自体は追加クエリ等でも実現できますが、
新しくテーブルを作る、もしくは結合元のテーブルに追加して更新してしまう必要があったりと
テーブルを結合させるだけならユニオンクエリがスマートかと思います。

スポンサーリンク

基本の使い方(UNION)

ユニオン画面の開き方

クエリデザイン→ユニオンで、ユニオン画面が開けますので、
そこにコードを入れることで使用できます。

1.クエリデザインをクリックし、デザインビューを開く

2.ユニオンをクリック

3.コード画面が開くので、記述して保存したら使用できるようになる

2つのテーブルを結合

基本的にユニオンクエリでは、
SELECT句で繋げたいテーブルを呼び出し、UNIONで結合させます。

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

SELECT * FROM テーブル1
UNION SELECT * FROM テーブル2;

◆実際のデータ例

・結合データ

ID社員NO氏名生年月日所属
1100001山田 花子2001/02/08庶務課
2100002田中 太郎1999/08/08営業課
テーブル1
ID社員NO氏名生年月日所属
1100001山田 花子2001/02/08庶務課
2200007園部 昭1999/12/08営業課
3200001伊藤 智晴2005/05/12経理課
テーブル2

・ ユニオンクエリ出力結果

ID社員NO氏名生年月日所属
1100001山田 花子2001/02/08庶務課
2100002田中 太郎1999/08/08営業課
2200007園部 昭1999/12/08営業課
3200001伊藤 智晴2005/05/12経理課

このように結合されます。
重複している 社員NO「100001」 は1件になって出力されます。
重複も出したい場合については後述します。

3つ以上のテーブルを結合

単純にUNIONを追加していくだけで、3つ以上結合することもできます。

SELECT * FROM テーブル1
UNION SELECT * FROM テーブル2
UNION SELECT * FROM テーブル3;

◆実際のデータ例

・結合データ

ID社員NO氏名生年月日所属
1100001山田 花子2001/02/08庶務課
2100002田中 太郎1999/08/08営業課
テーブル1
ID社員NO氏名生年月日所属
1100001山田 花子2001/02/08庶務課
2200007園部 昭1999/12/08営業課
3200001伊藤 智晴2005/05/12経理課
テーブル2
ID社員NO氏名生年月日所属
1300001乾 修2001/08/21人事課
テーブル3

・ユニオンクエリ出力結果

ID社員NO氏名生年月日所属
1100001山田 花子2001/02/08庶務課
1300001乾 修2001/08/21人事課
2100002田中 太郎1999/08/08営業課
2200007園部 昭1999/12/08営業課
3200001伊藤 智晴2005/05/12経理課
スポンサーリンク

基本+α

重複レコードの扱い(UNIONとUNION ALL)

先ほどUNIONでは重複レコードは除去されるとお伝えしましたが、
逆に重複レコードも表示したい場合は、UNION ALLを使います。

使い方は、UNIONをUNION ALLに置き換えるだけです。

SELECT * FROM テーブル1
UNION ALL SELECT * FROM テーブル2;

◆実際のデータ例

・結合データ

ID社員NO氏名生年月日所属
1100001山田 花子2001/02/08庶務課
2100002田中 太郎1999/08/08営業課
テーブル1
ID社員NO氏名生年月日所属
1100001山田 花子2001/02/08庶務課
2200007園部 昭1999/12/08営業課
3200001伊藤 智晴2005/05/12経理課
テーブル2

・ユニオンクエリ出力結果

ID社員NO氏名生年月日所属
1100001山田 花子2001/02/08庶務課
2100002田中 太郎1999/08/08営業課
1100001山田 花子2001/02/08庶務課
2200007園部 昭1999/12/08営業課
3200001伊藤 智晴2005/05/12経理課

絞り込み(Where)

ユニオンクエリは、通常の選択クエリと同様に絞り込みができます。
注意点として、絞り込む際はそれぞれのSELECT~に対してWhere句をつけることです。

★OK例(それぞれにWhere句)
 例えば、テーブル1から社員NO「100001」、テーブル2から社員NO「200001」を抜き出し結合する場合

SELECT * FROM テーブル1
where 社員NO = 100001
UNION SELECT * FROM テーブル2
where 社員NO = 200001;

◆実際のデータ例

・結合データ

ID社員NO氏名生年月日所属
1100001山田 花子2001/02/08庶務課
2100002田中 太郎1999/08/08営業課
テーブル1
ID社員NO氏名生年月日所属
1100001山田 花子2001/02/08庶務課
2200007園部 昭1999/12/08営業課
3200001伊藤 智晴2005/05/12経理課
テーブル2

・ユニオンクエリ出力結果

ID社員NO氏名生年月日所属
1100001山田 花子2001/02/08庶務課
3200001伊藤 智晴2005/05/12経理課

★NG例(最後にWhere句)
 例えば、本当は社員NO「100001」「200001」だけを抜き出したい場合

SELECT * FROM テーブル1
UNION SELECT * FROM テーブル2
where 社員NO = 100001 OR 社員NO = 200001;

◆実際のデータ例

・結合データ

ID社員NO氏名生年月日所属
1100001山田 花子2001/02/08庶務課
2100002田中 太郎1999/08/08営業課
テーブル1
ID社員NO氏名生年月日所属
1100001山田 花子2001/02/08庶務課
2200007園部 昭1999/12/08営業課
3200001伊藤 智晴2005/05/12経理課
テーブル2

・ユニオンクエリ出力結果

ID社員NO氏名生年月日所属
1100001山田 花子2001/02/08庶務課
2100002田中 太郎1999/08/08営業課
3200001伊藤 智晴2005/05/12経理課

この場合、Where句はテーブル2に適用されるため、テーブル1は全て出力されます。

並び替え(ORDER BY)

ユニオンクエリは、通常の選択クエリと同様に並び替えができます。
注意点として、Where句とは異なり最後にORDER BY句をつけて全体を並び替えることです。
(途中につけてもエラーにはなりませんが並び替えされません)

SELECT * FROM テーブル1
UNION SELECT * FROM テーブル2
ORDER BY 生年月日

◆実際のデータ例

・結合データ

ID社員NO氏名生年月日所属
1100001山田 花子2001/02/08庶務課
2100002田中 太郎1999/08/08営業課
テーブル1
ID社員NO氏名生年月日所属
1100001山田 花子2001/02/08庶務課
2200007園部 昭1999/12/08営業課
3200001伊藤 智晴2005/05/12経理課
テーブル2

・ユニオンクエリ出力結果

ID社員NO氏名生年月日所属
2100002田中 太郎1999/08/08営業課
2200007園部 昭1999/12/08営業課
1100001山田 花子2001/02/08庶務課
3200001伊藤 智晴2005/05/12経理課
スポンサーリンク

注意:結合するテーブルのフィールドが異なったらどうなるか

問題なく実行できる場合もありますが、基本的には合わせるのが無難です。

データ型が異なる場合

項目のデータ型が異なっている場合でも、テキスト型として結合されます。

例えば、テーブル1のある項目が日付型、テーブル2のある項目がテキスト型だった場合

SELECT * FROM テーブル1
UNION SELECT * FROM テーブル2;

◆実際のデータ例

・結合データ

ID社員NO氏名生年月日所属
1100001山田 花子2001/02/08庶務課
2100002田中 太郎1999/08/08営業課
テーブル1
ID社員NO氏名生年月日所属
1100001山田 花子あいうえお庶務課
2200007園部 昭かきくけこ営業課
3200001伊藤 智晴さしすせそ経理課
テーブル2

・ユニオンクエリ出力結果

異なるフィールド(データ型が異なる)

ID社員NO氏名生年月日所属
1100001山田 花子2001/02/08庶務課
1100001山田 花子あいうえお庶務課
2100002田中 太郎1999/08/08営業課
2200007園部 昭かきくけこ営業課
3200001伊藤 智晴さしすせそ経理課

項目数が異なる場合

項目数が異なる場合はエラーがでます。

SELECT * FROM テーブル1
UNION SELECT * FROM テーブル2;

◆実際のデータ例

・結合データ

ID社員NO氏名生年月日所属
1100001山田 花子2001/02/08庶務課
2100002田中 太郎1999/08/08営業課
テーブル1
ID社員NO氏名生年月日所属性別
1100001山田 花子2001/02/08庶務課
2200007園部 昭1999/12/08営業課
3200001伊藤 智晴2005/05/12経理課
テーブル2

・ユニオンクエリ出力結果

「ユニオン クエリで選択した 2つのテーブルまたはクエリの列数が一致しません。」

項目名が異なる場合

ユニオンクエリは項目名を見ていないため、問題なく処理できます。

SELECT * FROM テーブル1
UNION SELECT * FROM テーブル2;

◆実際のデータ例

・結合データ

ID社員NO氏名生年月日所属
1100001山田 花子2001/02/08庶務課
2100002田中 太郎1999/08/08営業課
テーブル1
ID
1100001山田 花子2001/02/08庶務課
2200007園部 昭1999/12/08営業課
3200001伊藤 智晴2005/05/12経理課
テーブル2

・ユニオンクエリ出力結果

ID社員NO氏名生年月日所属
1100001山田 花子2001/02/08庶務課
2100002田中 太郎1999/08/08営業課
2200007園部 昭1999/12/08営業課
3200001伊藤 智晴2005/05/12経理課
スポンサーリンク

小技)SQLが分からなくても大丈夫!ミスなく簡単にユニオンクエリを使う方法

ここまで読んで、SQLを学んだことがない方は、

Accessの知識だけで出来ないのはややこしいな……。ユニオンクエリって難しいな……

と思う方もいらっしゃるかもしれません。
確かに基本レベルのテーブル結合ならともかく、Where句等を使った少し難しいユニオンクエリをやろうとするとSQLの基本知識が必要です。

ただ、次に紹介する方法であれば特にSQLの知識がなくとも使うことができます。

  1. クエリを作成してSQLビューで開き、メモ帳にコピー(;は削除)
  2. 改行してUNION or UNION ALLを入れる
  3. クエリを作成してSQLビューで開き、メモ帳にコピー
    (必要であれば並び替えをする)
  4. 並び替えをする場合は、ORDER BY句の前にあるテーブル名を消す
  5. メモ帳からユニオンクエリ上にコピーして完成

具体的には以下のように作成します。

1.クエリを作成してSQLビューで開き、メモ帳にコピー(;は削除)

↓SQLビューで開く

SELECT [テーブル1].ID, [テーブル1].社員NO, [テーブル1].氏名, [テーブル1].生年月日, [テーブル1].所属
FROM テーブル1
WHERE ((([テーブル1].社員NO)=100002));

↓「;」を削除し、メモ帳にコピー

SELECT [テーブル1].ID, [テーブル1].社員NO, [テーブル1].氏名, [テーブル1].生年月日, [テーブル1].所属
FROM テーブル1
WHERE ((([テーブル1].社員NO)=100002))

2.改行してUNION or UNION ALLを入れる

SELECT [テーブル1].ID, [テーブル1].社員NO, [テーブル1].氏名, [テーブル1].生年月日, [テーブル1].所属
FROM テーブル1
WHERE ((([テーブル1].社員NO)=100002))
UNION

3.クエリを作成してSQLビューで開き、メモ帳にコピー(必要であれば並び替えをする)

SELECT [テーブル2].ID, [テーブル2].社員NO, [テーブル2].氏名, [テーブル2].生年月日, [テーブル2].所属
FROM テーブル2
ORDER BY [テーブル2].生年月日;

SELECT [テーブル1].ID, [テーブル1].社員NO, [テーブル1].氏名, [テーブル1].生年月日, [テーブル1].所属
FROM テーブル1
WHERE ((([テーブル1].社員NO)=100002))
UNION
SELECT [テーブル2].ID, [テーブル2].社員NO, [テーブル2].氏名, [テーブル2].生年月日, [テーブル2].所属
FROM テーブル2
ORDER BY [テーブル2].生年月日;

4.並び替えをする場合は、ORDER BY句の前にあるテーブル名を消す

前述の通り、並び替え(ORDER BY)だけは「最後に1つだけ」というルールがあるため全体にORDER BYがかかるように前のテーブル名は削除します。

SELECT [テーブル1].ID, [テーブル1].社員NO, [テーブル1].氏名, [テーブル1].生年月日, [テーブル1].所属
FROM テーブル1
WHERE ((([テーブル1].社員NO)=100002))
UNION
SELECT [テーブル2].ID, [テーブル2].社員NO, [テーブル2].氏名, [テーブル2].生年月日, [テーブル2].所属
FROM テーブル2
ORDER BY 生年月日;

5.メモ帳からユニオンクエリ上にコピーして完成

出来上がりです。

◆実際のデータ例

・結合データ

ID社員NO氏名生年月日所属
1100001山田 花子2001/02/08庶務課
2100002田中 太郎1999/08/08営業課
テーブル1
ID社員NO氏名生年月日所属
1100001山田 花子2001/02/08庶務課
2200007園部 昭1999/12/08営業課
3200001伊藤 智晴2005/05/12経理課
テーブル2

・ ユニオンクエリ出力結果

ID社員NO氏名生年月日所属
2100002田中 太郎1999/08/08営業課
2200007園部 昭1999/12/08営業課
1100001山田 花子2001/02/08庶務課
3200001伊藤 智晴2005/05/12経理課

これなら、SQLが分からなくても難なくできるかと思います♪

本ブログで一押しのオンラインスクールのご紹介♪




本ブログで一押しのオンラインスクール「Udemy」
筆者も利用しているスクールで、日頃の隙間時間に好きな講座が学べるので大活躍です♪

ジャンルが豊富で学びたい講座がきっとみつかる

AI・データサイエンスなど最先端のIT技術からプレゼンなどビジネススキルに関する講座まで15.5万以上(※海外講座含む)あるため、自分が学びたい講座をみつけることができます

お手頃な価格帯

1講座あたり数千~数万円程度で実践的なスキルアップが可能です。
講座は一度購入すれば視聴期限なく受講でき、30日返金保証もついているので安心して始めることができます。

学びやすい多彩な機能

0.5~2倍の変速機能で自分のペースで受講が可能、専用アプリを使えばスマホからオフライン環境でも視聴が可能です!
また、講師に直接掲示板から質問ができるので疑問を解決し自学自習をサポートしてくれます。

購入前に視聴できますので、是非興味のある方は↓をクリックしてみてください。




AccessOffice
スポンサーリンク
nyanblog
タイトルとURLをコピーしました