Accessの「不一致クエリ」を使用すると、2つのテーブルを比較して、片方のテーブルにしか存在しないデータを簡単に抽出することができます。
例えば、「テーブルA」「テーブルB」を比較して、「テーブルAに有るけどテーブルBに無いデータ」、あるいは逆に「テーブルAに無いけどテーブルBに有るデータ」を、クエリで抽出できます。
具体的な方法について、ご説明いたします。
サンプルデータ
以下のような2つのテーブル「社員マスタ2024」「社員マスタ2025」を使って、ご説明いたします。

不一致クエリの作成
「不一致クエリ ウィザード」を使う方法もありますが、ここでは「クエリデザイン」で新規作成する方法でご説明いたします。
まずは、「社員マスタ2024に有るけど社員マスタ2025に無いデータ」を抽出してみます。
- step1
リボンから [作成] ➡ [クエリデザイン] を選択します。
- step2
新たに表示されたクエリの画面に、テーブル「社員マスタ2024」「社員マスタ2025」をドラッグ&ドロップします。
※[Ctrl]キーを押しながらテーブルをまとめて選択できます。 - step3
今回は[社員番号]をキー項目として比較するため、[社員番号]同士を結ぶようにマウスをドラッグします。
※[社員マスタ2024]の[社員番号]をクリックしたまま、マウスを[社員マスタ2025]の[社員番号]までドラッグして、マウスボタンを離します。うまくいくと、下図のように[社員番号]同士が線で結ばれます。 - step4
[社員番号]を結んでいる線の部分をダブルクリックすると、下図のようなダイアログが表示されます。
ここでは、「2:’社員マスタ2024’ の全レコードと ‘社員マスタ2025’ の同じ結合フィールドのレコードだけを含める。」を選択します。
[OK]を押すと、下図のように[社員番号]を結んでいる線に矢印が付きます。 - step5
「社員マスタ2024に有るけど社員マスタ2025に無いデータ」を抽出するので、[社員マスタ2024]の各フィールド(社員番号・氏名)を表示するように、クエリ下部のフィールド欄にドラッグします。
- step6ここからがキモになります。
「社員マスタ2025に無いデータ」を抽出するために、[社員マスタ2025]の[社員番号]を、クエリ下部のフィールド欄にドラッグします。
- step7
[社員マスタ2025]の[社員番号]の[抽出条件]をNullにします。
また、当項目は表示しても意味がないので(Nullのデータしか抽出しないので)、[表示]のチェックボックスを外しておきます。 - step8これで完成です。
クエリを表示すると、「社員マスタ2024に有るけど社員マスタ2025に無いデータ」が抽出されます。
ちょっと手順が長いので、慣れないと手間取るかもしれませんが、慣れてしまえば非常に便利です。
逆のパターンの不一致クエリ
先ほどは、「社員マスタ2024に有るけど社員マスタ2025に無いデータ」を抽出してみました。
今度は逆に、「社員マスタ2024に無いけど社員マスタ2025に有るデータ」を抽出してみます。
先ほどのstep4に戻って、[社員マスタ2024]と[社員マスタ2025]を逆にすれば良いのですが、順を追ってご説明いたします。
- step4(改)
[社員番号]を結んでいる線の部分をダブルクリックして、表示されるダイアログで、今度は「3:’社員マスタ2025’ の全レコードと ‘社員マスタ2024’ の同じ結合フィールドのレコードだけを含める。」を選択します。
すると、[社員番号]を結んでいる矢印の向きが逆になります。 - step5~7
(改)クエリに表示するテーブルを、[社員マスタ2025]に変えます。
また、[社員番号]がNullのデータを抽出する対象テーブルを、[社員マスタ2024]に変えます。 - step8これで完成です。
クエリを表示すると、「社員マスタ2024に無いけど社員マスタ2025に有るデータ」が抽出されます。
両テーブルの不一致データをまとめて抽出する方法
これまでの方法だと、「テーブルAに有るけどテーブルBに無いデータ」と「テーブルAに無いけどテーブルBに有るデータ」を片方ずつしか確認できないので、これでは不便という場合もあるかと思います。
両者をまとめて表示するには、以下の手順が必要です。
- それぞれのクエリを別名で保存する。
- 保存した両方のクエリを、ユニオンクエリで結合する。
先ほどの[社員マスタ2024]と[社員マスタ2025]を使って、具体的にご説明いたします。
- step1
「社員マスタ2024に有るけど社員マスタ2025に無いデータ」を抽出するクエリを、「クエリ_2025無し」という名前を付けて保存する
※クエリの名前は何でも良いです。お好みに応じて付けて下さい。 - step2
「社員マスタ2024に無いけど社員マスタ2025に有るデータ」を抽出するクエリを、「クエリ_2024無し」という名前を付けて保存する
- step3
「クエリデザイン」で新しいクエリを表示して、「ユニオン」クエリを作成する
- step4
真っ白なウインドウが表示されるので、以下のSQL文を打ち込む
select * from クエリ_2024無し union select * from クエリ_2025無し
- step5
これで、両方の差分がまとめて表示されます。
しかし、以下の通り両方が混ざってしまい、どちらの差分か分からなくなるので、もうひと工夫します。 - step6
先ほど作成した「クエリ_2025無し」「クエリ_2024無し」それぞれに、以下のようにどちらの差分かを判別できるフィールドを追加する。
- step7
「クエリ_2025無し」「クエリ_2024無し」をそれぞれ上書き保存してから、先ほど作成した「ユニオン」クエリを開き直すと、以下のように、どちらの差分か分かるように表示されます。
比較したいキー項目が複数ある場合
これまでは、[社員番号]という1つの項目で、両方のテーブルを比較していました。
しかし、以下の例に挙げた銀行口座情報のように、「支店コード & 口座番号」という2つの項目を使って比較する場合もあります。

このような場合ですが、下図のように、複数の項目を線で結べば対応可能です。

注意点として、結んだ線をダブルクリックするところですが、全ての線をダブルクリックして、線を矢印に変える必要があります。



これで、差分が抽出できます。
※矢印に変えていない線が混ざっていると、「あいまいな外部結合が含まれているので、SQLステートメントを実行できません。」というエラーが出てしまいます。

コメント