MS Access Tips/Sample and VBA and Blog customize etc...

クエリで2つのテーブルを同期させる

Aテーブルがあります。商品コードとロットフィールドがあり、それをBテーブルにデータを反映させたいのですが、Bテーブルに商品コードとロットが存在すれば上書き(書き換え)なければ、追加する仕組みを作りたいのですが、どうすればよろしいでしょうか?

上記のような要望は、結構あると思います。

普通に考えれば、上書きと追加の2つの処理が必要なので、更新クエリと追加クエリの2つのクエリが必要になると思われます。

しかし、一つのクエリで実現できる方法もあります。

タイトル

難易度:

仕様

テーブルA 追加元テーブル、テーブルB 追加先テーブル。

どちらも、「商品コード」と「ロット」フィールドで複数フィールド主キー、 それ以外に、値フィールド が存在するとします。

更新クエリと追加クエリ

まずは、普通に考えつく2つのクエリを利用する方法。

キーが一致するレコードを上書きする更新クエリ

キーが一致しないレコード(新規レコード)を追加する追加クエリ

この2つのクエリを実行すれば同期は完了します。

更新クエリ一つで処理

更新クエリ

クエリのデザインビュークエリデザインビュー

実は最初の更新クエリを、外部結合に変更し、更新するフィールドを増やしただけです。これだけで、上書きと追加が同時に可能です。

解説

更新クエリで、なぜ、更新と追加が同時にできるのでしょうか。その仕組みを下記のデータ例で説明してみます。

テーブルA
商品コードロット値フィールド
11A
12B
13C
14D
テーブルB
商品コードロット値フィールド
11C
12D

この2つのテーブルをクエリで左外部結合するクエリを作成します。すると、クエリのデータセットは下記のようになります。

テーブルA
商品コード
テーブルA
ロット
テーブルA
値フィールド
テーブルB
商品コード
テーブルB
ロット
テーブルB
値フィールド
11A11C
12B12D
13C   
14D   

このクエリで、1行目と2行目のテーブルB.値フィールドを手入力で更新してみましょう。もちろん更新できますね。

>>
テーブルA
商品コード
テーブルA
ロット
テーブルA
値フィールド
テーブルB
商品コード
テーブルB
ロット
テーブルB
値フィールド
11A11A
12B12B
13C   
14D   

また、3行目と4行目のテーブルB の商品コード、ロット、値フィールド はNUllになってますが、ここに値を入力して下記のように更新することも可能ですね。

>>
テーブルA
商品コード
テーブルA
ロット
テーブルA
値フィールド
テーブルB
商品コード
テーブルB
ロット
テーブルB
値フィールド
11A11A
12B12B
13C13C
14D14D

ここでテーブルBを開いて確認してみてください。テーブルBには2件新規データが追加されていますね。クエリ上ではNullフィールドに値を入力したことになりますが、テーブルBにとっては追加になるのです。

上記は手入力でやりましたが、この外部結合クエリを更新クエリにすれば、同じことが自動でできます。これが更新クエリでテーブルに追加もできる仕掛けです。

拍手する

2 Comments

新居 says..."追加クエリーがうまくいきません 教えていただけませんか?"

access 2010で テーブル T_受発注案件の オーダー№ と 商品区分ID 商品区分を T_作業明細データ_Testに追加したいのですがうまくいきません 作業明細で オーダー№でリンクしています。 入力するときに明細行に 商品区分IDで抽出した明細が下のサブフォームにでて数量を入れると計算する仕組みのため
1. 受注時に案件詳細を入力 → オーダー№で明細入力をしようとしていますがうまく動作しません ご指導お願いします

2016.09.01 11:36 | URL | #- [edit]
hatena says..."re:追加クエリーがうまくいきません 教えていただけませんか?"

ここは、この記事への感想や質問をする場所です。

特にこの記事とは関連性のない質問ですので、メニューの「Access BBS」をクリックして掲示板の方でもう一度質問してください。

2016.09.01 23:03 | URL | #5uE6dEgY [edit]

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/153-72ecf510
該当の記事は見つかりませんでした。