導入文
Accessでデータ管理をしていると、
- 同じデータが何件も登録されてしまう
- インポート時に重複レコードが増える
- 集計結果が合わなくなる
といったトラブルは非常によく発生します。
本記事では、Accessで「重複データ」を安全に確認し、SQLを使って削除する方法を初心者向けに分かりやすく解説します。
すべてコピペで動くSQL例付きです。
1. 重複データとは何か
たとえば次のようなテーブルがあるとします。
| ID | 氏名 | メール |
|---|---|---|
| 1 | 田中 | a@test.com |
| 2 | 佐藤 | b@test.com |
| 3 | 田中 | a@test.com |
この場合、
「氏名+メール」が同じレコードが重複しています。
まずは重複データを確認する(SELECT)
いきなり削除するのは危険です。
まずは重複しているデータを抽出して確認します。
SQL①:重複データを抽出
SELECT 氏名, メール, Count(*) AS 件数
FROM T_顧客
GROUP BY 氏名, メール
HAVING Count(*) > 1;
※ T_顧客 は実際のテーブル名に変更してください。
このSQLで、重複している組み合わせだけが表示されます。
重複レコードの一覧を表示する
重複している「中身」を確認したい場合はこちら。
SQL②:重複している全レコードを表示
SELECT *
FROM T_顧客
WHERE (氏名, メール) IN
(SELECT 氏名, メール
FROM T_顧客
GROUP BY 氏名, メール
HAVING Count(*) > 1)
ORDER BY 氏名, メール;
重複データを削除する基本SQL
Accessでは、同じ内容のレコードを1件残して他を削除する方法がよく使われます。
SQL③:IDが大きい方を削除(安全な方法)
DELETE FROM T_顧客
WHERE ID NOT IN
(SELECT Min(ID)
FROM T_顧客
GROUP BY 氏名, メール);
意味:
- 同じ氏名・メールの中で
- 一番小さいIDだけ残す
- それ以外を削除
VBAから実行する方法
SQLをVBAから実行することも可能です。
VBA例
CurrentDb.Execute "DELETE FROM T_顧客 WHERE ID NOT IN (SELECT Min(ID) FROM T_顧客 GROUP BY 氏名, メール)", dbFailOnError
MsgBox "重複データを削除しました"
日付が含まれる場合の注意点
日付型は Format しないと一致判定で失敗することがあります。
日付を含む重複削除例
DELETE FROM T_売上
WHERE ID NOT IN
(SELECT Min(ID)
FROM T_売上
GROUP BY 顧客ID, Format(売上日, 'yyyy/mm/dd'));
削除前に必ずやるべき安全対策
削除SQL実行前に:
- 必ずバックアップを取る
- SELECT文で確認する
- テスト用コピーで試す
SELECT * INTO T_顧客_backup FROM T_顧客;
よくあるエラーと対処
エラー①:更新可能なクエリではありません
原因:
- JOIN付きクエリ
- 集計クエリ
対策:
元テーブルに対してDELETEを実行する。
エラー②:型が一致しません
原因:
- 数値と文字列の混在
- Null値
対策:
Nz関数を使う。
GROUP BY Nz(氏名,''), Nz(メール,'')
関連記事(内部リンク推奨)
まとめ
AccessではSQLを使えば、重複データを安全に抽出・削除することが可能です。
本記事のポイント:
- GROUP BY + HAVING で重複確認
- Min(ID) を残して削除
- VBAからも実行可能
- 必ずバックアップを取る
重複削除をマスターすれば、データ管理の信頼性が大きく向上します。
実務でも非常によく使う処理なので、ぜひ活用してください。