Accessで重複したレコードを削除する方法

概要

この記事の結論
Accessで重複レコードを削除するには、まず何を同一とみなすかを決め、重複を抽出してから残す行と削除する行を確定します。主キーが異なる行を、画面の名前が同じという理由だけで消してはいけません。

この記事でわかること

  • バックアップを取り重複候補を抽出する
  • 残すIDを確定する
  • 削除候補IDを別表に保存する
  • 確定したIDだけを削除する

この記事の主な内容

  1. 重複の定義と残す行を先に決める
  2. バックアップを取り重複候補を抽出する
  3. 残すIDを確定する
  4. 削除候補IDを別表に保存する
  5. 確定したIDだけを削除する
  6. 再発を防ぐ一意性と取込手順を作る
  7. よくある質問

想定読了時間:約8分


1 重複の定義と残す行を先に決める

Accessで重複レコードを削除するには、まず何を同一とみなすかを決め、重複を抽出してから残す行と削除する行を確定します。主キーが異なる行を、画面の名前が同じという理由だけで消してはいけません。

ここでは、同じ顧客コード・商品コード・受注日を重複とする架空の取込表を例にします。
同日の別注文があり得る業務では、この組み合わせでは不十分です。

重複整理の順序について、定義、選択、削除の関係を示す図

2 バックアップを取り重複候補を抽出する

重複クエリウィザード、またはGROUP BYとHAVINGを使う集計クエリで、2件以上ある組み合わせを探します。
まずは候補の一覧を見るだけにし、削除クエリはまだ実行しません。

顧客コードなどにNullがあると、同じ値として結合する処理で取りこぼす場合があります。
今回の例は重複判定の3項目がすべて入力済みという前提です。未入力行は別に抽出して確認します。

サンプルコードと式

SELECT [顧客コード], [商品コード], [受注日], Count(*) AS 件数
FROM [T_取込]
GROUP BY [顧客コード], [商品コード], [受注日]
HAVING Count(*)>1;

重複候補の抽出について、組合せ、集計、条件の関係を示す図

3 残すIDを確定する

最小IDを残す方法は、最初に取り込まれた行を正とするルールがある場合に使えます。最新の更新内容を残したい場合は、更新日時とIDなどを使い、同時刻の行も一意に選べるルールを設けます。

残す行の判断について、最小ID、更新日時、内容差の関係を示す図。

ID 10と11が同じ注文で、11だけに重要な備考があるなら、単純に11を削除すると情報を失います。値が異なる列は、どちらを正とするか確認してから統合してください。

設定例と確認点

ID判定例扱い
10同一注文の元行残す候補
11同一注文の再取込削除候補
12別注文維持
削除候補の保存について、候補ID、再表示、記録の関係を示す図。

4 削除候補IDを別表に保存する

削除する主キーだけをW_削除候補に保存し、対象テーブルと結合して内容を再表示します。
この作業表があると、削除対象の確認と記録を分離できます。
作業表のIDは一意にし、確認中に元データが変わらない運用で行います。

操作手順

1. 削除候補IDをW_削除候補に登録します。

2. T_取込とIDで結合し、候補の全列を確認します。

3. 候補件数と残る件数を記録します。

4. 子テーブルが対象IDを参照していないか確認します。

5. バックアップの復元確認後に削除します。

子テーブルへの影響について、削除ID、参照先、残すIDの関係を示す図。

5 確定したIDだけを削除する

下記は、W_削除候補に確定済みIDが入っている前提の削除例です。
実行前に同じWHERE条件のSELECT文で対象を確認します。
削除後の件数は、削除前件数から候補件数を引いた数と照合します。

親レコードのIDが子テーブルから参照されている場合は、残すIDへの対応付けと子側の更新が必要になることがあります。連鎖削除を使って解決しようとすると、必要な明細まで失う危険があります。

サンプルコードと式

DELETE FROM [T_取込]
WHERE [ID] IN (SELECT [ID] FROM [W_削除候補]);

削除後の照合について、件数、対象ID、残存行の関係を示す図。

既存Accessへの影響を判断できない場合

本記事の手順をコピーしたファイルで試しても解決しない場合や、既存データ・他の画面への影響を判断できない場合は、お気軽にご相談ください。対象ファイル、操作手順、期待する結果を整理すると、調査や改修の範囲を相談しやすくなります。


6 再発を防ぐ一意性と取込手順を作る

重複整理後は、業務上本当に一意なキーに重複なしのインデックスを設ける方法を検討します。
複数列の組み合わせで一意なら、複合インデックスが候補です。Nullを許容する場合の扱いも確認してください。

ファイルを再取込する業務では、取込バッチIDや外部の注文番号で二重登録を判定します。
画面の重複表示だけを消すDISTINCTは、元テーブルの重複削除とは異なります。

重複の再発防止について、キー、索引、取込の関係を示す図。

7 よくある質問

DISTINCTは表示結果の重複を除く指定です。
元データの削除ではありません。

業務ルール次第です。
最新の情報や子テーブルの参照を確認します。

同名の別顧客もあり得ます。
顧客コードなど業務上の識別条件で判断します。

まとめと相談先

ファイルを再取込する業務では、取込バッチIDや外部の注文番号で二重登録を判定します。
画面の重複表示だけを消すDISTINCTは、元テーブルの重複削除とは異なります。

本記事の手順をコピーしたファイルで試しても解決しない場合や、既存データ・他の画面への影響を判断できない場合は、お気軽にご相談ください。対象ファイル、操作手順、期待する結果を整理すると、調査や改修の範囲を相談しやすくなります。


参考情報

Microsoft公式資料を参照しています。サンプルは説明用の架空データです。
Windows版Accessの実機検証は未実施のため、適用前に対象環境のコピーで結果を確認してください。

Microsoft:削除クエリ
https://support.microsoft.com/en-us/access/create-and-run-a-delete-query

Microsoft:DELETE文
https://learn.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/delete-statement-microsoft-access-sql

Microsoft:GROUP BY
https://learn.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/group-by-clause-microsoft-access-sql

TOP