Accessのテーブルに同じデータが二重に登録されたとき、いきなり削除クエリを作ると、残すべきレコードまで消してしまうおそれがあります。削除クエリは元に戻せません。次の順番で進めてください。
- バックアップを取り、削除前の件数を控える
- 何をもって「重複」とするかを決める
- 重複クエリウィザードで、重複の件数を確かめる
- 残す1件の基準を決める
- 削除対象を選択クエリで表示し、件数を確かめる
- 削除クエリで消す
- 削除後の件数を確かめる
以下では、次のような 顧客 テーブルを例にします。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のテキスト比較は、通常は大文字と小文字を区別しません。そのほかの文字の違いがどう扱われるかは、データベースの設定によって変わることがあります。どの組み合わせが重複と判定されたかは、次の手順で結果を見て確認してください。
重複クエリウィザードで重複の件数を確かめる
- 「作成」タブ→「クエリウィザード」を開く
- 「重複クエリウィザード」を選んで「OK」
- 対象のテーブル(
顧客)を選んで「次へ」 - 重複を調べるフィールド(
顧客名、電話番号)を選んで「次へ」 - 一緒に表示するフィールドとして
IDと登録日を選んで「次へ」 - クエリ名を付けて「完了」
結果には、重複しているレコードが一覧で表示されます。手順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 句は、必ず同じにします。
実行する前に、次の点を確かめます。
- プレビューする: 「表示」→「データシートビュー」に切り替えると、削除対象のレコードが表示されます。この操作では削除されません
- 実行する: デザインビューまたはSQLビューに戻り、「実行」(!のボタン)を押す
- 件数を確認する: 削除するレコード数を知らせる確認メッセージが出たら、その件数が削除予定件数と一致するか確かめる。一致しなければ「いいえ」を選んで中止する
実行しても何も起きず、操作がブロックされたというメッセージが出る場合は、データベースが無効モードで開かれています。画面上部のセキュリティの警告で「コンテンツの有効化」を押してから、もう一度実行してください。
レコード数が多いテーブルでは、NOT IN を使ったクエリの実行に時間がかかることがあります。バックアップのコピーで先に試し、どのくらい時間がかかるか確かめておくと安心です。
削除後の件数を確かめる
削除が終わったら、次の3点を確認します。
- 件数の差: 削除前の件数 - 削除件数 = 削除後の件数 になっているか(
SELECT Count(*) FROM 顧客;で確認) - 重複の有無: 重複クエリをもう一度実行して、結果が0件になるか
- 残ったレコード: 残したレコードを何件か開き、想定どおりのIDが残っているか
削除しても、Accessのファイルサイズはすぐには小さくなりません。「ファイル」→「情報」→「データベースの最適化/修復」を実行すると、削除した分の領域が整理されます。
同じ重複を再発させない
削除した後に同じ二重登録が起きないよう、重複を受け付けないインデックスを設定できます。
- 1つのフィールドで重複を防ぐ場合: テーブルのデザインビューで対象のフィールドを選び、「インデックス」プロパティを「はい (重複なし)」にする
- 複数のフィールドの組み合わせで防ぐ場合: デザインビューで「インデックス」ボタンを押し、1つのインデックス名に
顧客名と電話番号を並べて登録し、「固有」を「はい」にする
重複が残っているとインデックスは設定できないため、設定は削除が終わった後に行います。設定した後は、重複するデータを追加クエリで追加しようとしても、その行は追加されません。
