PR

【Access】2つのテーブルのアンマッチデータを抽出する「不一致クエリ」

Access
記事内に広告を含む場合があります。

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

Accessを書籍でコツコツ学習したい方はこちら

サンプルデータ

以下のような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ステートメントを実行できません。」というエラーが出てしまいます。

Accessを書籍でコツコツ学習したい方はこちら

コメント

タイトルとURLをコピーしました