LoginSignup
1
0

More than 1 year has passed since last update.

Oracleのテーブルで全カラムが重複しているレコードを削除する

Last updated at Posted at 2022-11-18

はじめに

あるアプリの開発中にやってしまった失敗の話です。
別システムから取得したデータをOracleのテーブルにインサートするプログラムにバグがあり、まったく同じ内容のレコードが複数回インサートされてしましました。(このテーブルにはプライマリーキーがないため全てのカラムが同じ内容のレコードが存在し得ます)
テーブルにはすでに過去のデータが入っているため全件削除してインサートし直すことは出来ず、そもそもプログラム実行日時が入るカラムがあるのでインサートの再実行はやりたくありません。
どうしても重複したレコードだけを削除する必要がありました。
ネット上にはWHERE句で結合して削除するやり方が見つかったんですが、カラム数がかなり多いためJOINして削除する方法を考えました。

考え方

  1. 全レコードを全てのカラムでグループ化してレコード固有のROWIDの最小値の一覧を取得します
  2. この一覧に無いROWIDのレコードを削除することでユニークな行だけが残ります。

コード

DELETE FROM
	table_a T1
WHERE
	T1.ROWID IN (
		SELECT
			T2.ROWID
		FROM
			table_a T2
			LEFT JOIN (
				SELECT
					MIN(ROWID) RID
				FROM
					table_a
				GROUP BY
					column_1,
					column_2,
					column_3,
					(以下カラムが続く)
			) T3 ON T2.ROWID = T3.RID
		WHERE
			T3.RID IS NULL
	)
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0