今回は、テーブルやクエリを結合するユニオンクエリの使い方を紹介します。
SQLが苦手な方は、
「小技)SQLが分からなくても大丈夫!ミスなく簡単にユニオンクエリを作成する方法」
も合わせてご覧になってください。
ユニオンクエリとは
ユニオンクエリは、テーブルやクエリを結合することができるクエリです。
それ以上でもそれ以下でもありませんが、 使えると非常に便利なクエリです。
例えば、実際の業務では
AというテーブルとBというテーブルがあった際に、
途中の処理は違うけど最終的に同じデータの構造にして結合させるとき等に使ったりします。
テーブルの結合自体は追加クエリ等でも実現できますが、
新しくテーブルを作る、もしくは結合元のテーブルに追加して更新してしまう必要があったりと
テーブルを結合させるだけならユニオンクエリがスマートかと思います。
基本の使い方(UNION)
ユニオン画面の開き方
クエリデザイン→ユニオンで、ユニオン画面が開けますので、
そこにコードを入れることで使用できます。
1.クエリデザインをクリックし、デザインビューを開く
2.ユニオンをクリック
3.コード画面が開くので、記述して保存したら使用できるようになる
2つのテーブルを結合
基本的にユニオンクエリでは、
SELECT句で繋げたいテーブルを呼び出し、UNIONで結合させます。
例えば、テーブル1・2を結合させる場合は以下のように記述します。
SELECT * FROM テーブル1
UNION SELECT * FROM テーブル2;
◆実際のデータ例
・結合データ
ID | 社員NO | 氏名 | 生年月日 | 所属 |
---|---|---|---|---|
1 | 100001 | 山田 花子 | 2001/02/08 | 庶務課 |
2 | 100002 | 田中 太郎 | 1999/08/08 | 営業課 |
ID | 社員NO | 氏名 | 生年月日 | 所属 |
---|---|---|---|---|
1 | 100001 | 山田 花子 | 2001/02/08 | 庶務課 |
2 | 200007 | 園部 昭 | 1999/12/08 | 営業課 |
3 | 200001 | 伊藤 智晴 | 2005/05/12 | 経理課 |
・ ユニオンクエリ出力結果
ID | 社員NO | 氏名 | 生年月日 | 所属 |
---|---|---|---|---|
1 | 100001 | 山田 花子 | 2001/02/08 | 庶務課 |
2 | 100002 | 田中 太郎 | 1999/08/08 | 営業課 |
2 | 200007 | 園部 昭 | 1999/12/08 | 営業課 |
3 | 200001 | 伊藤 智晴 | 2005/05/12 | 経理課 |
このように結合されます。
重複している 社員NO「100001」 は1件になって出力されます。
重複も出したい場合については後述します。
3つ以上のテーブルを結合
単純にUNIONを追加していくだけで、3つ以上結合することもできます。
SELECT * FROM テーブル1
UNION SELECT * FROM テーブル2
UNION SELECT * FROM テーブル3;
◆実際のデータ例
・結合データ
ID | 社員NO | 氏名 | 生年月日 | 所属 |
---|---|---|---|---|
1 | 100001 | 山田 花子 | 2001/02/08 | 庶務課 |
2 | 100002 | 田中 太郎 | 1999/08/08 | 営業課 |
ID | 社員NO | 氏名 | 生年月日 | 所属 |
---|---|---|---|---|
1 | 100001 | 山田 花子 | 2001/02/08 | 庶務課 |
2 | 200007 | 園部 昭 | 1999/12/08 | 営業課 |
3 | 200001 | 伊藤 智晴 | 2005/05/12 | 経理課 |
ID | 社員NO | 氏名 | 生年月日 | 所属 |
---|---|---|---|---|
1 | 300001 | 乾 修 | 2001/08/21 | 人事課 |
・ユニオンクエリ出力結果
ID | 社員NO | 氏名 | 生年月日 | 所属 |
---|---|---|---|---|
1 | 100001 | 山田 花子 | 2001/02/08 | 庶務課 |
1 | 300001 | 乾 修 | 2001/08/21 | 人事課 |
2 | 100002 | 田中 太郎 | 1999/08/08 | 営業課 |
2 | 200007 | 園部 昭 | 1999/12/08 | 営業課 |
3 | 200001 | 伊藤 智晴 | 2005/05/12 | 経理課 |
基本+α
重複レコードの扱い(UNIONとUNION ALL)
先ほどUNIONでは重複レコードは除去されるとお伝えしましたが、
逆に重複レコードも表示したい場合は、UNION ALLを使います。
使い方は、UNIONをUNION ALLに置き換えるだけです。
SELECT * FROM テーブル1
UNION ALL SELECT * FROM テーブル2;
◆実際のデータ例
・結合データ
ID | 社員NO | 氏名 | 生年月日 | 所属 |
---|---|---|---|---|
1 | 100001 | 山田 花子 | 2001/02/08 | 庶務課 |
2 | 100002 | 田中 太郎 | 1999/08/08 | 営業課 |
ID | 社員NO | 氏名 | 生年月日 | 所属 |
---|---|---|---|---|
1 | 100001 | 山田 花子 | 2001/02/08 | 庶務課 |
2 | 200007 | 園部 昭 | 1999/12/08 | 営業課 |
3 | 200001 | 伊藤 智晴 | 2005/05/12 | 経理課 |
・ユニオンクエリ出力結果
ID | 社員NO | 氏名 | 生年月日 | 所属 |
---|---|---|---|---|
1 | 100001 | 山田 花子 | 2001/02/08 | 庶務課 |
2 | 100002 | 田中 太郎 | 1999/08/08 | 営業課 |
1 | 100001 | 山田 花子 | 2001/02/08 | 庶務課 |
2 | 200007 | 園部 昭 | 1999/12/08 | 営業課 |
3 | 200001 | 伊藤 智晴 | 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 | 氏名 | 生年月日 | 所属 |
---|---|---|---|---|
1 | 100001 | 山田 花子 | 2001/02/08 | 庶務課 |
2 | 100002 | 田中 太郎 | 1999/08/08 | 営業課 |
ID | 社員NO | 氏名 | 生年月日 | 所属 |
---|---|---|---|---|
1 | 100001 | 山田 花子 | 2001/02/08 | 庶務課 |
2 | 200007 | 園部 昭 | 1999/12/08 | 営業課 |
3 | 200001 | 伊藤 智晴 | 2005/05/12 | 経理課 |
・ユニオンクエリ出力結果
ID | 社員NO | 氏名 | 生年月日 | 所属 |
---|---|---|---|---|
1 | 100001 | 山田 花子 | 2001/02/08 | 庶務課 |
3 | 200001 | 伊藤 智晴 | 2005/05/12 | 経理課 |
★NG例(最後にWhere句)
例えば、本当は社員NO「100001」「200001」だけを抜き出したい場合
SELECT * FROM テーブル1
UNION SELECT * FROM テーブル2
where 社員NO = 100001 OR 社員NO = 200001;
◆実際のデータ例
・結合データ
ID | 社員NO | 氏名 | 生年月日 | 所属 |
---|---|---|---|---|
1 | 100001 | 山田 花子 | 2001/02/08 | 庶務課 |
2 | 100002 | 田中 太郎 | 1999/08/08 | 営業課 |
ID | 社員NO | 氏名 | 生年月日 | 所属 |
---|---|---|---|---|
1 | 100001 | 山田 花子 | 2001/02/08 | 庶務課 |
2 | 200007 | 園部 昭 | 1999/12/08 | 営業課 |
3 | 200001 | 伊藤 智晴 | 2005/05/12 | 経理課 |
・ユニオンクエリ出力結果
ID | 社員NO | 氏名 | 生年月日 | 所属 |
---|---|---|---|---|
1 | 100001 | 山田 花子 | 2001/02/08 | 庶務課 |
2 | 100002 | 田中 太郎 | 1999/08/08 | 営業課 |
3 | 200001 | 伊藤 智晴 | 2005/05/12 | 経理課 |
この場合、Where句はテーブル2に適用されるため、テーブル1は全て出力されます。
並び替え(ORDER BY)
ユニオンクエリは、通常の選択クエリと同様に並び替えができます。
注意点として、Where句とは異なり最後にORDER BY句をつけて全体を並び替えることです。
(途中につけてもエラーにはなりませんが並び替えされません)
SELECT * FROM テーブル1
UNION SELECT * FROM テーブル2
ORDER BY 生年月日
◆実際のデータ例
・結合データ
ID | 社員NO | 氏名 | 生年月日 | 所属 |
---|---|---|---|---|
1 | 100001 | 山田 花子 | 2001/02/08 | 庶務課 |
2 | 100002 | 田中 太郎 | 1999/08/08 | 営業課 |
ID | 社員NO | 氏名 | 生年月日 | 所属 |
---|---|---|---|---|
1 | 100001 | 山田 花子 | 2001/02/08 | 庶務課 |
2 | 200007 | 園部 昭 | 1999/12/08 | 営業課 |
3 | 200001 | 伊藤 智晴 | 2005/05/12 | 経理課 |
・ユニオンクエリ出力結果
ID | 社員NO | 氏名 | 生年月日 | 所属 |
---|---|---|---|---|
2 | 100002 | 田中 太郎 | 1999/08/08 | 営業課 |
2 | 200007 | 園部 昭 | 1999/12/08 | 営業課 |
1 | 100001 | 山田 花子 | 2001/02/08 | 庶務課 |
3 | 200001 | 伊藤 智晴 | 2005/05/12 | 経理課 |
注意:結合するテーブルのフィールドが異なったらどうなるか
問題なく実行できる場合もありますが、基本的には合わせるのが無難です。
データ型が異なる場合
項目のデータ型が異なっている場合でも、テキスト型として結合されます。
例えば、テーブル1のある項目が日付型、テーブル2のある項目がテキスト型だった場合
SELECT * FROM テーブル1
UNION SELECT * FROM テーブル2;
◆実際のデータ例
・結合データ
ID | 社員NO | 氏名 | 生年月日 | 所属 |
---|---|---|---|---|
1 | 100001 | 山田 花子 | 2001/02/08 | 庶務課 |
2 | 100002 | 田中 太郎 | 1999/08/08 | 営業課 |
ID | 社員NO | 氏名 | 生年月日 | 所属 |
---|---|---|---|---|
1 | 100001 | 山田 花子 | あいうえお | 庶務課 |
2 | 200007 | 園部 昭 | かきくけこ | 営業課 |
3 | 200001 | 伊藤 智晴 | さしすせそ | 経理課 |
・ユニオンクエリ出力結果
異なるフィールド(データ型が異なる)
ID | 社員NO | 氏名 | 生年月日 | 所属 |
---|---|---|---|---|
1 | 100001 | 山田 花子 | 2001/02/08 | 庶務課 |
1 | 100001 | 山田 花子 | あいうえお | 庶務課 |
2 | 100002 | 田中 太郎 | 1999/08/08 | 営業課 |
2 | 200007 | 園部 昭 | かきくけこ | 営業課 |
3 | 200001 | 伊藤 智晴 | さしすせそ | 経理課 |
項目数が異なる場合
項目数が異なる場合はエラーがでます。
SELECT * FROM テーブル1
UNION SELECT * FROM テーブル2;
◆実際のデータ例
・結合データ
ID | 社員NO | 氏名 | 生年月日 | 所属 |
---|---|---|---|---|
1 | 100001 | 山田 花子 | 2001/02/08 | 庶務課 |
2 | 100002 | 田中 太郎 | 1999/08/08 | 営業課 |
ID | 社員NO | 氏名 | 生年月日 | 所属 | 性別 |
---|---|---|---|---|---|
1 | 100001 | 山田 花子 | 2001/02/08 | 庶務課 | 女 |
2 | 200007 | 園部 昭 | 1999/12/08 | 営業課 | 男 |
3 | 200001 | 伊藤 智晴 | 2005/05/12 | 経理課 | 男 |
・ユニオンクエリ出力結果
「ユニオン クエリで選択した 2つのテーブルまたはクエリの列数が一致しません。」
項目名が異なる場合
ユニオンクエリは項目名を見ていないため、問題なく処理できます。
SELECT * FROM テーブル1
UNION SELECT * FROM テーブル2;
◆実際のデータ例
・結合データ
ID | 社員NO | 氏名 | 生年月日 | 所属 |
---|---|---|---|---|
1 | 100001 | 山田 花子 | 2001/02/08 | 庶務課 |
2 | 100002 | 田中 太郎 | 1999/08/08 | 営業課 |
ID | あ | い | う | え |
---|---|---|---|---|
1 | 100001 | 山田 花子 | 2001/02/08 | 庶務課 |
2 | 200007 | 園部 昭 | 1999/12/08 | 営業課 |
3 | 200001 | 伊藤 智晴 | 2005/05/12 | 経理課 |
・ユニオンクエリ出力結果
ID | 社員NO | 氏名 | 生年月日 | 所属 |
---|---|---|---|---|
1 | 100001 | 山田 花子 | 2001/02/08 | 庶務課 |
2 | 100002 | 田中 太郎 | 1999/08/08 | 営業課 |
2 | 200007 | 園部 昭 | 1999/12/08 | 営業課 |
3 | 200001 | 伊藤 智晴 | 2005/05/12 | 経理課 |
小技)SQLが分からなくても大丈夫!ミスなく簡単にユニオンクエリを使う方法
ここまで読んで、SQLを学んだことがない方は、
Accessの知識だけで出来ないのはややこしいな……。ユニオンクエリって難しいな……
と思う方もいらっしゃるかもしれません。
確かに基本レベルのテーブル結合ならともかく、Where句等を使った少し難しいユニオンクエリをやろうとするとSQLの基本知識が必要です。
ただ、次に紹介する方法であれば特にSQLの知識がなくとも使うことができます。
- クエリを作成してSQLビューで開き、メモ帳にコピー(;は削除)
- 改行してUNION or UNION ALLを入れる
- クエリを作成してSQLビューで開き、メモ帳にコピー
(必要であれば並び替えをする) - 並び替えをする場合は、ORDER BY句の前にあるテーブル名を消す
- メモ帳からユニオンクエリ上にコピーして完成
具体的には以下のように作成します。
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 | 氏名 | 生年月日 | 所属 |
---|---|---|---|---|
1 | 100001 | 山田 花子 | 2001/02/08 | 庶務課 |
2 | 100002 | 田中 太郎 | 1999/08/08 | 営業課 |
ID | 社員NO | 氏名 | 生年月日 | 所属 |
---|---|---|---|---|
1 | 100001 | 山田 花子 | 2001/02/08 | 庶務課 |
2 | 200007 | 園部 昭 | 1999/12/08 | 営業課 |
3 | 200001 | 伊藤 智晴 | 2005/05/12 | 経理課 |
・ ユニオンクエリ出力結果
ID | 社員NO | 氏名 | 生年月日 | 所属 |
---|---|---|---|---|
2 | 100002 | 田中 太郎 | 1999/08/08 | 営業課 |
2 | 200007 | 園部 昭 | 1999/12/08 | 営業課 |
1 | 100001 | 山田 花子 | 2001/02/08 | 庶務課 |
3 | 200001 | 伊藤 智晴 | 2005/05/12 | 経理課 |
これなら、SQLが分からなくても難なくできるかと思います♪