ヘルプの森~Excel・Access・Office全般ヘルプデスクサイト

No.007

アイコン 複数テーブルをつなげてレコードを結合する 《ユニオン クエリ》

Access2003/2007/2010/2013/2016

同じフィールドで構成された複数のテーブルのレコードをそのままつなげて結合、合体させる方法を、お問い合わせいただくことが何度もあります。
方法としては、追加クエリを実行させる方法とユニオン クエリという方法があります。

今回は柔軟でおもしろい、ユニオン クエリをご紹介します。
ユニオン クエリはいくつかの特徴がありますので、その点をおさえながらご案内します。

例えば、次のようなテーブル[テーブル1][テーブル2][テーブル3]があり、データをそのままつなげるとします。

3つのテーブル

これらのテーブル、多少変則です。
3つのテーブル、すべてのレコード数は12となります。
1件目のレコードは見た目同じデータ、しかしデータ型が統一されていません。
特に、テーブル[テーブル3]の[F3]フィールドはテキスト型です。

では、この3つのテーブルをユニオン クエリを作成して結合してみます。
まずは、ユニオン クエリの作成方法です。

  1. クエリをデザイン ビューで新規作成し、テーブルを追加せずに空で作成します。
  2. [クエリ ツール]-[デザイン]タブ-[クエリの種類]グループ-[ユニオン]をクリックします。
    ユニオン
  3. クエリのデザイン ビューは真っ白になりました。あとはSQLを記述します。

<基本のユニオン>

3つのテーブルを、抽出や条件を設定せずに結合します。

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

これが基本の書き方となります。
*を指定すると、すべての列という意味になります。
結果は次のとおりです。

ユニオン1

件数は10件、すべての列で同じデータ3件は1件にまとめられています。

その他、ユニオン クエリでは、実はフィールド名の合致は必要ありません。最初に指定したテーブルのフィールド名となります。(フィールド名の変更は後述)
ただし、フィールド数は同じでないといけません。

<抽出条件>

抽出条件を設定して結合します。

SELECT * FROM テーブル1
WHERE F1="A"
UNION SELECT * FROM テーブル2
WHERE F3=100
UNION SELECT * FROM テーブル3
WHERE F2="おお";

各テーブルで違う抽出条件を設定することができます。結果は次のとおりです。

ユニオン2

<フィールドを指定>

フィールドを指定して表示したい場合は、次のように記述します。

SELECT F1,F2 FROM テーブル1
UNION SELECT F1,F2 FROM テーブル2
UNION SELECT F1,F2 FROM テーブル3;

結果は次のとおり、8件です。

ユニオン3

フィールドを同じ数指定するのであれば、元のテーブルのフィールド数は違っていても構いません。

結果フィールド名を変更する場合はAS句を使用し、1行目を次のように指定します。

SELECT F1 AS フィールド1 ,F2 AS フィールド2 FROM テーブル1
UNION SELECT F1,F2 FROM テーブル2
UNION SELECT F1,F2 FROM テーブル3;

<重複も表示>

今までは結果に重複データは省かれていましたが、ALL句を使用すれば重複もすべて表示することができます。

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

ユニオン4

さて、追加クエリでテーブルのレコードを結合する場合は次のような動作状況となります。
追加先のテーブルに主キーが設定されている場合、同じ主キーレコードは追加されず、エラーが出ます。また、データ型も一致している必要があります。
主キーが設定されていない場合は、重複レコードが生じます。

ユニオン クエリは本当に柔軟な対応ができますので、いざというときに重要な役割を果たしてくれます。

関連ヘルプ

テーブルのデータ型をクエリで変更する 《データ定義クエリ》
削除クエリで、別のテーブルまたはクエリと共通するレコードを一括削除する
ページのトップへ戻る