PR

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

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