accessデータベース操作 PR

Accessで重複データを削除する方法【SQL付き|初心者〜実務向け】

記事内に商品プロモーションを含む場合があります

導入文

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実行前に:

  1. 必ずバックアップを取る
  2. SELECT文で確認する
  3. テスト用コピーで試す
SELECT * INTO T_顧客_backup FROM T_顧客;

よくあるエラーと対処

エラー①:更新可能なクエリではありません

原因:

  • JOIN付きクエリ
  • 集計クエリ

対策:
元テーブルに対してDELETEを実行する。


エラー②:型が一致しません

原因:

  • 数値と文字列の混在
  • Null値

対策:
Nz関数を使う。

GROUP BY Nz(氏名,''), Nz(メール,'')

関連記事(内部リンク推奨)


まとめ

AccessではSQLを使えば、重複データを安全に抽出・削除することが可能です。

本記事のポイント:

  • GROUP BY + HAVING で重複確認
  • Min(ID) を残して削除
  • VBAからも実行可能
  • 必ずバックアップを取る

重複削除をマスターすれば、データ管理の信頼性が大きく向上します。

実務でも非常によく使う処理なので、ぜひ活用してください。