Accessのテーブルに同じデータが二重に登録されたとき、いきなり削除クエリを作ると、残すべきレコードまで消してしまうおそれがあります。削除クエリは元に戻せません。次の順番で進めてください。

  1. バックアップを取り、削除前の件数を控える
  2. 何をもって「重複」とするかを決める
  3. 重複クエリウィザードで、重複の件数を確かめる
  4. 残す1件の基準を決める
  5. 削除対象を選択クエリで表示し、件数を確かめる
  6. 削除クエリで消す
  7. 削除後の件数を確かめる

以下では、次のような 顧客 テーブルを例にします。ID はオートナンバー型です。

ID 顧客名 電話番号 登録日
1 山田商店 03-1111-2222 2026/04/01
2 鈴木工業 06-3333-4444 2026/04/03
3 山田商店 03-1111-2222 2026/05/10

この例では、ID 1と3が重複しています。

作業前にバックアップを取り、件数を控える

バックアップは、次のどちらかで取ります。

  • ファイルごとコピーする: Accessを閉じてから、.accdb ファイルをコピーする。共有しているデータベースの場合は、ほかの人が開いていないときに行う
  • テーブルだけコピーする: ナビゲーションウィンドウで対象のテーブルを選び、Ctrl + C → Ctrl + V を押す。貼り付けのオプションで「テーブル構造とデータ」を選び、顧客_削除前 のような名前を付ける

あわせて、削除前のレコード数を控えます。テーブルを開いたときに画面下部のレコード移動ボタンの横に表示される件数か、次のクエリの結果を使います。

SELECT Count(*) AS 件数 FROM 顧客;

SQLを入力するには、「作成」タブ→「クエリデザイン」を開き、テーブルの追加画面を閉じてから、「表示」→「SQLビュー」に切り替えます。

何をもって重複とするかを決める

最初に決めるのは、どのフィールドが一致したら重複とみなすかです。

  • オートナンバーの ID は比較に含めない: 重複レコードでもIDは必ず違うため、IDを含めると重複が見つからなくなります
  • 比較するフィールドを決める: すべてのフィールドが同じ場合だけを重複とするのか、顧客名 と 電話番号 が同じなら重複とするのかを決めます
  • 表記ゆれは別の作業になる: 「株式会社」と「(株)」、全角と半角の違いなど、値が完全には一致しない重複は、この方法では拾えないことがあります。名寄せとして別に扱ってください

Accessのテキスト比較は、通常は大文字と小文字を区別しません。そのほかの文字の違いがどう扱われるかは、データベースの設定によって変わることがあります。どの組み合わせが重複と判定されたかは、次の手順で結果を見て確認してください。

重複クエリウィザードで重複の件数を確かめる

  1. 「作成」タブ→「クエリウィザード」を開く
  2. 「重複クエリウィザード」を選んで「OK」
  3. 対象のテーブル(顧客)を選んで「次へ」
  4. 重複を調べるフィールド(顧客名、電話番号)を選んで「次へ」
  5. 一緒に表示するフィールドとして ID と 登録日 を選んで「次へ」
  6. クエリ名を付けて「完了」

結果には、重複しているレコードが一覧で表示されます。手順5で何も追加しなければ、重複している値の組み合わせごとに件数が表示されます。このウィザードで作られるのは確認用の選択クエリなので、実行してもデータは消えません。

重複のグループごとの件数は、次のSQLでも確認できます。

SELECT 顧客名, 電話番号, Count(*) AS 件数
FROM 顧客
GROUP BY 顧客名, 電話番号
HAVING Count(*) > 1;

この結果から、削除される予定の件数を計算しておきます。

削除予定件数 = 件数の合計 - 重複グループの数

たとえば件数が2・2・3の3グループなら、合計7件のうち各グループ1件ずつ残すため、7 - 3 = 4件が削除予定です。後の手順で、この数字と照らし合わせます。

残す1件の基準を決める

グループの中でどの1件を残すかを決めます。

基準 使う場面
IDが最小のもの(最初に登録された行) 後から二重登録された行を消したいとき
IDが最大のもの(最後に登録された行) 後から登録した行のほうが情報が新しいとき
個別に判断する 重複レコードの間で、住所やメモなど比較していないフィールドの内容が違うとき

比較していないフィールドの内容が違う場合、機械的にIDの最小を残すと、新しいほうの情報が消えます。重複クエリの結果で、ほかのフィールドの内容も確認してから決めてください。

関連するテーブルがある場合

受注 テーブルが 顧客ID で顧客を参照しているような場合は、「データベースツール」→「リレーションシップ」でつながりを確認します。

  • 参照整合性が設定されている場合: 受注データが残っている顧客は削除できず、一部のレコードが削除できなかったというメッセージが出ることがあります
  • 連鎖削除が設定されている場合: 顧客を消すと、その顧客の受注データも一緒に削除されます。これがいちばん危険です
  • リレーションシップが設定されていない場合: 削除はできますが、受注側に存在しない顧客IDが残ります

どの場合も、削除する顧客を参照している受注データは、先に残す側のIDへ付け替えてください(更新クエリを使います)。付け替えが済むまで、削除には進まないでください。

削除対象を選択クエリで表示する

ここでは「IDが最小の1件を残す」場合を例にします。まず、削除されるレコードを選択クエリで表示します。

SELECT *
FROM 顧客
WHERE ID NOT IN (
  SELECT Min(ID)
  FROM 顧客
  GROUP BY 顧客名, 電話番号
);

内側のクエリで各グループのIDの最小値(残すID)を求め、それ以外のレコードを表示しています。重複していないレコードは、グループの中で自分自身が最小値になるので、ここには表示されません。

確認すること:

  • 表示された件数が、先に計算した削除予定件数と一致するか
  • 残すべきレコードが含まれていないか

IDが最大のものを残す場合は、Min(ID) を Max(ID) に変えます。

空欄(Null)のレコードに注意する

GROUP BY では、Nullのレコード同士が同じグループにまとめられます。そのため、顧客名 が同じで 電話番号 がどちらも空欄のレコードは、重複として削除対象になります。空欄同士は重複とみなしたくない場合は、条件を追加します。

SELECT *
FROM 顧客
WHERE ID NOT IN (
  SELECT Min(ID)
  FROM 顧客
  GROUP BY 顧客名, 電話番号
)
AND 電話番号 Is Not Null;

空欄に見えても、Nullではなく長さ0の文字列("")が入っていることもあります。その場合は、Nullとは別の値として扱われます。

この選択クエリは、削除候補_顧客 のような名前で保存しておくと、後で確認し直せます。

削除クエリで消す

選択クエリで確認できたら、同じ条件で削除クエリを作ります。

DELETE FROM 顧客
WHERE ID NOT IN (
  SELECT Min(ID)
  FROM 顧客
  GROUP BY 顧客名, 電話番号
);

Nullの条件を追加した場合は、削除クエリにも同じ条件を入れてください。選択クエリと削除クエリの WHERE 句は、必ず同じにします。

実行する前に、次の点を確かめます。

  1. プレビューする: 「表示」→「データシートビュー」に切り替えると、削除対象のレコードが表示されます。この操作では削除されません
  2. 実行する: デザインビューまたはSQLビューに戻り、「実行」(!のボタン)を押す
  3. 件数を確認する: 削除するレコード数を知らせる確認メッセージが出たら、その件数が削除予定件数と一致するか確かめる。一致しなければ「いいえ」を選んで中止する

実行しても何も起きず、操作がブロックされたというメッセージが出る場合は、データベースが無効モードで開かれています。画面上部のセキュリティの警告で「コンテンツの有効化」を押してから、もう一度実行してください。

レコード数が多いテーブルでは、NOT IN を使ったクエリの実行に時間がかかることがあります。バックアップのコピーで先に試し、どのくらい時間がかかるか確かめておくと安心です。

削除後の件数を確かめる

削除が終わったら、次の3点を確認します。

  • 件数の差: 削除前の件数 - 削除件数 = 削除後の件数 になっているか(SELECT Count(*) FROM 顧客; で確認)
  • 重複の有無: 重複クエリをもう一度実行して、結果が0件になるか
  • 残ったレコード: 残したレコードを何件か開き、想定どおりのIDが残っているか

削除しても、Accessのファイルサイズはすぐには小さくなりません。「ファイル」→「情報」→「データベースの最適化/修復」を実行すると、削除した分の領域が整理されます。

同じ重複を再発させない

削除した後に同じ二重登録が起きないよう、重複を受け付けないインデックスを設定できます。

  • 1つのフィールドで重複を防ぐ場合: テーブルのデザインビューで対象のフィールドを選び、「インデックス」プロパティを「はい (重複なし)」にする
  • 複数のフィールドの組み合わせで防ぐ場合: デザインビューで「インデックス」ボタンを押し、1つのインデックス名に 顧客名 と 電話番号 を並べて登録し、「固有」を「はい」にする

重複が残っているとインデックスは設定できないため、設定は削除が終わった後に行います。設定した後は、重複するデータを追加クエリで追加しようとしても、その行は追加されません。

おすすめの記事