概要
| この記事の結論 Accessで重複レコードを削除するには、まず何を同一とみなすかを決め、重複を抽出してから残す行と削除する行を確定します。主キーが異なる行を、画面の名前が同じという理由だけで消してはいけません。 |
この記事でわかること
- バックアップを取り重複候補を抽出する
- 残すIDを確定する
- 削除候補IDを別表に保存する
- 確定したIDだけを削除する
この記事の主な内容
- 重複の定義と残す行を先に決める
- バックアップを取り重複候補を抽出する
- 残すIDを確定する
- 削除候補IDを別表に保存する
- 確定したIDだけを削除する
- 再発を防ぐ一意性と取込手順を作る
- よくある質問
想定読了時間:約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 10と11が同じ注文で、11だけに重要な備考があるなら、単純に11を削除すると情報を失います。値が異なる列は、どちらを正とするか確認してから統合してください。
設定例と確認点
| ID | 判定例 | 扱い |
|---|---|---|
| 10 | 同一注文の元行 | 残す候補 |
| 11 | 同一注文の再取込 | 削除候補 |
| 12 | 別注文 | 維持 |

4 削除候補IDを別表に保存する
削除する主キーだけをW_削除候補に保存し、対象テーブルと結合して内容を再表示します。
この作業表があると、削除対象の確認と記録を分離できます。
作業表のIDは一意にし、確認中に元データが変わらない運用で行います。
操作手順
1. 削除候補IDをW_削除候補に登録します。
2. T_取込とIDで結合し、候補の全列を確認します。
3. 候補件数と残る件数を記録します。
4. 子テーブルが対象IDを参照していないか確認します。
5. バックアップの復元確認後に削除します。

5 確定したIDだけを削除する
下記は、W_削除候補に確定済みIDが入っている前提の削除例です。
実行前に同じWHERE条件のSELECT文で対象を確認します。
削除後の件数は、削除前件数から候補件数を引いた数と照合します。
親レコードのIDが子テーブルから参照されている場合は、残すIDへの対応付けと子側の更新が必要になることがあります。連鎖削除を使って解決しようとすると、必要な明細まで失う危険があります。
サンプルコードと式
DELETE FROM [T_取込]
WHERE [ID] IN (SELECT [ID] FROM [W_削除候補]);

既存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