「重複削除」タグアーカイブ

SQL:重複データを安全に削除する方法(DELETE+ROW_NUMBER)

データベースを長く運用していると、アプリのバグやテストデータの混入、複数サーバ間複製のトラブルなどが原因で、重複データが発生することがあります。
しかし、安易に DELETE を実行すると必要なデータまで消えてしまう危険があります。

そこで本記事では、ROW_NUMBER() を使って重複行を安全に削除する方法をわかりやすく解説します。


🎯 本記事のゴール

  • 重複データを判定する方法が理解できる

  • 削除対象を事前に確認できる

  • ROW_NUMBER()DELETE の実践手順がわかる


重複データとは?

以下のように、ユニークであるべき項目(メールアドレス、社員番号、商品コードなど)が複数存在する状態です。

idemailname
1aaa@test.com
Tanaka
2aaa@test.com
Tanaka
3bbb@test.com
Suzuki

この場合、aaa@test.com が重複行となります。


手順①:重複データの行番号を振る

まずは削除対象となる行を特定します。
ROW_NUMBER() OVER (PARTITION BY ...) で同じキーを持つ行に番号を付与します。

実行結果例

idemailrn
1aaa@test.com
1
2aaa@test.com
2
3bbb@test.com
1

rn = 1 を残して rn > 1 を削除対象とします。


手順②:削除対象のみを事前確認

※ 実務では必ずこのチェックを推奨


手順③:重複行を削除

🔒 サブクエリが必要な理由

一部DBでは DELETE ... FROM 内で ROW_NUMBER() を直接参照できないため
サブクエリ(派生テーブル)を挟む必要があります。


💡 Delete 実行前の注意点

注意点内容
バックアップ取得DELETE後は戻せない
トランザクション内で実行BEGIN / ROLLBACK の利用
WHERE句のチェックWHERE間違いは致命傷
ORDER BYの基準を決める新しいデータを残す/古いデータを残すなど

例:最新データを残したい場合


DBごとの対応表

DB使用可否
PostgreSQL
SQL Server
Oracle
MySQL 8.0 以降
MySQL 5.x× → サブクエリ+JOINで対応
MariaDB

※ MySQL 5系の場合は別途記事で解説予定


まとめ

結論内容
ROW_NUMBER()は重複削除に最適削除対象を明確化できる
いきなりDELETEしないSELECTで必ず事前確認
ORDER基準を明確にする残すデータのルール決め

安全に確実に重複を削除するには
「削除対象の可視化」→「確認」→「DELETE」
という流れがとても重要です。

Excel:重複データを削除(除去)する方法

Excelで重複データを削除する方法をご紹介します。
重複データを削除するだけならExcelの標準機能で簡単に削除する事が可能です。

動作環境

    Microsoft Office Professional 2013

Excelで重複データを削除する手順

  1. 重複したい範囲を選択し、メニューの「データ」タブ⇒「重複の削除」を選択します。
  2. 重複の削除ダイアログが表示されたら対象の列を選択し、「OK」ボタンを選択します。
  3. 重複データが削除されると以下の様なメッセージが表示されます。
  4. メッセージが表示されたら重複データが削除され、選択した列のデータが一意になります。

🧩 補足:重複削除の前に確認しておきたいポイント

重複の削除は一度実行すると元に戻せない場合があります。操作前に次の点をチェックしておくと安心です。

  • 元データをコピーしてバックアップを取る

  • どの列(または複数列の組み合わせ)で重複を判断するかを明確にしておく

  • 空白セルや大文字・小文字の扱いを統一しておく(例:「Apple」と「apple」を同一とみなすか)

  • 削除前にフィルターや条件付き書式で重複箇所を目視確認しておく

また、Excel 365 以降を利用している場合は、UNIQUE 関数を使って重複を除いたリストを生成する方法も便利です。
たとえば次のように入力すると、列 A から重複なしの一覧を自動で作成できます。

=UNIQUE(A2:A100)

このように、作業前に条件を整理しておくことで、意図しないデータ削除を防ぎ、より安全にデータをクリーンアップできます。