スポンサーリンク

【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が分からなくても難なくできるかと思います♪

【高コスパ!】Windows11対応ノートパソコンを目的別にご紹介♪

【高コスパ!】Windows11対応ノートパソコンを目的別にご紹介♪

みみねこ
みみねこ
値段が安くても、安かろう悪かろうでは意味がない!
ローコスト&快適に使えるスペックで、本当にお値段以上のノートパソコンを紹介します♪

ネット検索や動画視聴などのライトユーザーから、学業やビジネスで持ち運び目的のユーザーに最適!

14.0型/第3世代Ryzen 5/メモリ 8GB/SSD 256GB/Webカメラなので、
持ち運び用として学業やビジネスにも十分使えます!

・学業、ビジネスに最適!

15.6型/第10世代インテル Core i5/メモリ 8GB/SSD 256GB/Webカメラなので、学業やビジネスに!

・動画編集やネットゲームに最適!

16.0型/第4世代Ryzen 7/メモリ 16GB/SSD 512GB/GeForce GTX1650/Webカメラなので、
3Dゲームや動画編集に!

最近は、Lenovo製品が最もコスパが良い印象なので、Lenovo製品中心に紹介しています。
コスパが高いだけではなく、故障しやすかったり、タイピングしにくかったりとチープな要素が少ない等、他社類似メーカーと比べても優れています。
ただ、実際に購入される際は、海外メーカー特有ではありますが納期が遅い商品も多く、納品日にはご注意されてくださいね。

スポンサーリンク
AccessOffice
スポンサーリンク
nyanblog ~にゃんぶろぐ~
タイトルとURLをコピーしました