ExcelとAccessのスキルアップをサポートするサイトです

ExcelとAccessの学習室

【Accessクエリ入門】8回目-追加クエリを作る方法

この記事で学習できること
  • 追加クエリの基本手順
  • 追加クエリを使うべきタイミング
  • 追加クエリを安全に使いこなすためのコツ

Accessクエリ入門シリーズ8回目の今回は、追加クエリについて解説していきます。

追加クエリはAccessのテーブルに新しいデータを追加するときに使うクエリで、SQLのINSERT文に相当する機能です。
また、INSERT文はデータベースを扱う人は必ず知っておかないといけない知識の一つでもあります。

クエリの編集画面からだけでなく、Accessフォームを使った入力作業やバッチ処理など、Accessを使用するさまざまなシーンでもよく使われる機能ですので、しっかりと習得しておきましょう。

本記事では、Access追加クエリの基本的な使い方だけでなく、SQL文の中身や注意点についても解説しています。
いまAccess学習の真っ最中の方は、本記事の内容をぜひ学習に活用してください。

どんな時に追加クエリを使う?

追加クエリは、抽出したデータを別のテーブルに新しい行として追記する処理です。
イメージとしては、Excelで「抽出した行を別シートに値貼り付け」する感じ。
元テーブルはそのまま、追加先テーブルにだけ行が増えると覚えてください。

実務を想定した場面としては、ざっと以下のような内容が挙げられます。

  • CSVやExcelから読み込んだ一時テーブルの内容を、本番テーブルにまとめて取込
  • 月次締めや確定後データを、履歴テーブルに追記保存
  • 顧客・商品などのマスタに、新規だけを一括追加したい
  • 基幹DBなど外部のテーブル(リンク)から、自分のテーブルにコピー
  • 元データを触らず、抽出結果だけを別テーブルにして試算・検証
  • パフォーマンス維持のため、一定期間より前の行を退避

つまり追加クエリは、取込→本番履歴化マスタ一括登録外部連携作業テーブル作成アーカイブ化など、業務のさまざまな場面で活躍する幅広い機能です。

追加クエリの基本手順

手順1-まずは選択クエリで結果を確認する

ここに空テーブル「T99_部品単価一覧表」があります。
他のテーブルデータを使い、まとまったデータを一括追加していきます。

新しい空のクエリを作ります。
追加したいデータを作るときは「選択クエリ」のままで編集しましょう。

クエリ内にテーブル「T01発注先マスタ」「T01部品マスタ」「T01価格マスタ」を追加します。

追加したいテーブル構成に合わせてフィールドを選択しましょう。

追加クエリでは、フィールドを選択するだけでなく、必要に応じて抽出条件を抽出(WHERE)したり、集計関数を使う(GROUP BY)こともできます。

手順2-追加クエリに切り替え(宛先と列対応を指定)

追加したいデータを作り終わったら、選択クエリを追加クエリに切り替えます。
クエリデザインの追加をクリックします。

追加先のテーブルを選びます。

そのままOKをクリックします。

クエリのデザイングリッドの項目が変わり、追加先テーブルのフィールドも表示されました。

これで追加先のフィールドを設定することができました。
「レコードの追加」に何も表示されない場合は、フィールド名などが間違っていることもありますので、クエリを実行する前によく確認しておきましょう。

手順3-クエリを実行して件数を確認する

では、追加クエリを実行して空のテーブルにデータを追加していきます。
リボンメニューの実行ボタンをクリックします。

確認ダイアログが表示されますが、そのまま「はい」をクリック。

追加先のテーブル「T99_部品単価一覧」を確認すると、データが正しく追加されているようです。

追加クエリは他のクエリとアイコンが異なるので、探すときの目印にしてください。

オブジェクトブラウザのアクションクエリをクリックすれば、実行ボタンを押したときと同じ動きが再現されます。
実行した回数だけ重複してデータ追加されてしまいますので、追加クエリのアイコンを触るときは特に注意しましょう。

実は、SQLビューを直接編集することで重複追加を防げます。

それは、WHERE以降に「NOT EXISTS」を追記することです。
後日別記事で解説しますが、参考のために以下のSQLコードを掲載しておきます。

INSERT INTO T99_部品単価一覧表 (部品ID, 単価)
SELECT s.部品ID, s.単価
FROM T01価格マスタ AS s
WHERE NOT EXISTS (
  SELECT 1 FROM T99_部品単価一覧表 AS t
  WHERE t.部品ID = s.部品ID
);

SQLビューで確認する追加クエリ(INSERT INTO … SELECT)

では、追加クエリを作ったときに自動作成されたSQL文を確認してみましょう。
SQLビューに切り替えると、下の画像のようにSQL文が作られています。

中身をよく見ると、INSERT文とSELECT文の両方が混在しているようです。

他のデータベースでも共通して使われるINSERT文の基本は、以下のような書き方です。

INSERT INTO [追加先のフィールド名] VALUES ( [追加したいデータ])

一方、ACCESSの追加クエリで作成させたSQLは以下の書き方です。

INSERT INTO [追加先のフィールド名] SELECT文

このように、AccessではSELECT文で抽出したデータをそのままINSERT文で挿入できるため、複数のレコードを効率的に一括追加することが可能です。

このINSERT INTO SELECTの構文は、PostgreSQLMySQLSQL ServerなどのRDBでも広く使用可能です。
複数のデータをまとめて追加したい場合は便利な書き方ですので、慣れておきましょう。

追加クエリの注意点(安全に使うコツ)

注意点1-本番でいきなり実行しない

前準備抜きでいきなり追加クエリを試すのはとても危険です。

軽い気持ちで試したものの、SQL文が間違っていたため、復旧に莫大な時間をかけるといったことがあってはいけません。
まずは、必ずダミーテーブルで試してから本番の操作を行ってください。
そして、想定した結果になっているかも忘れず確認しましょう。

また、本番の操作を行う直前にも、対象テーブルのバックアップは欠かさないようにしましょう。

注意点2-1件だけ追加ならSQLを直接書く(INSERT … VALUES)

Accessの追加クエリは、主にまとめたデータを一括追加する時に使われますが、状況によっては1件分だけデータを追加したい時もあります。
そんな時はSQL共通で使われるINSERT文をそのまま使用することをオススメします。

試しに、以下の設定で1件分だけデータを追加するクエリを作ってみました。

  • 「T01部品マスタ」に「鉄 アングル」という商品を「SUS アングル」に書き換えてデータを追加

単一データを追加されるようにクエリを編集すると、書き方は下の画像のようになります。
1件の項目を入力するために、データ項目を直接手入力する人はおそらくいないでしょう。

参考までにSQLビューを確認してみると、やはりINSERTとSELECTが混在しています。

一方、下のようにSQL共通のINSERT文に変えても正しくクエリは実行されます。

1件分だけデータを追加する場合、追加クエリをそのまま使うのではなく、VBAコードの中に基本に忠実なINSERT文を盛り込んだ方がより現実的です。

注意点3-主キー・外部キーなど構成に沿う(参照整合性を守る)

追加クエリを実行されずにエラーが発生するパターンについても触れておきましょう。
追加クエリを実行するときに注意しないといけないことは、参照整合性を無視した書き方になっていないかということです。

単一データを追加するときに使ったクエリを少しだけ編集してみます。
変更後では『小分類ID』を削除してみました。

クエリを実行してみると、エラーで先に進めません。

テーブル『T01部品マスタ』の『小分類ID』は、テーブル『T00小分類マスタ』間でリレーションシップが組まれています。

Accessでは、リレーションシップに関係するフィールドにデータが入力されないと、対象のレコードの追加が出来ない仕組みになっています。
もし似たようなエラーが発生した場合は、リレーションシップを含むデータベース設計に違反した書き方になっていないかを見直すと、いち早く原因を突き止めることができるでしょう。

まとめ

今回は、Accessの追加クエリの使い方を解説しました。
Accessの追加クエリを使うことで、大量のデータを一括で追加することができるので便利です。
一方で、1件分だけデータを追加したいときは、INSERT文をそのまま使うのをおすすめします。
また、追加クエリの実行エラーが発生するときは、リレーションシップなどのデータベース設計に違反していないかを見直すとよいでしょう。

次回は、削除クエリについて解説します。