一意な識別子を持たない重複した行を削除する方法
2023-10-30 05:13:04
質問
テーブルに重複した行があり、テーブルが大きいので最も効率的な方法で重複を削除したいと思います。いくつかの研究の後、私はこのクエリを思いついた。
WITH TempEmp AS
(
SELECT name, ROW_NUMBER() OVER(PARTITION by name, address, zipcode ORDER BY name) AS duplicateRecCount
FROM mytable
)
-- Now Delete Duplicate Records
DELETE FROM TempEmp
WHERE duplicateRecCount > 1;
しかし、これは SQL でしか動作せず、Netezza では動作しません。どうやら
DELETE
の後に
WITH
句の後?
どのように解決するのですか?
私は @erwin-brandstetter の解決策が好きです。
USING
キーワードを使用した解決策を示したいと思いました。
DELETE FROM table_with_dups T1
USING table_with_dups T2
WHERE T1.ctid < T2.ctid -- delete the "older" ones
AND T1.name = T2.name -- list columns that define duplicates
AND T1.address = T2.address
AND T1.zipcode = T2.zipcode;
削除する前にレコードを確認したい場合は、単純に
DELETE
を
SELECT *
と
USING
をコンマで区切って
,
である。
SELECT * FROM table_with_dups T1
, table_with_dups T2
WHERE T1.ctid < T2.ctid -- select the "older" ones
AND T1.name = T2.name -- list columns that define duplicates
AND T1.address = T2.address
AND T1.zipcode = T2.zipcode;
更新:ここでいくつかの異なる解決策を速度についてテストしてみました。 もし多くの重複を期待しないのであれば、この解決法は
NOT IN (...)
節を持つものよりも、このソリューションの方がはるかに良いパフォーマンスを示します。
もしクエリを書き換えて
IN (...)
を使うように書き直すと、ここで紹介した解決策と同じように動作しますが、SQL コードはずっと簡潔ではなくなります。
更新2: もし
NULL
の値がキーカラムのひとつにある場合 (本当は IMO しないほうがいいのですが)、そのカラムに
COALESCE()
をそのカラムの条件に使うことができます。
AND COALESCE(T1.col_with_nulls, '[NULL]') = COALESCE(T2.col_with_nulls, '[NULL]')
関連
-
[解決済み] MySQLの「スキーマの作成」と「データベースの作成」 - 違いはあるのか?
-
[解決済み] SQL Server で複数行のテキストを 1 つのテキスト文字列に連結する方法
-
[解決済み] 重複した行を削除するにはどうすればよいですか?
-
[解決済み] SQLのIN句をパラメータ化する
-
[解決済み] 最初の行への結合方法
-
[解決済み] SQL Serverで、指定したテーブルを参照しているすべての外部キーを一覧表示するにはどうすればよいですか?
-
[解決済み] SQL Serverでレコードを削除した後、IDシードをリセットする。
-
[解決済み] SQL SELECT WHERE フィールドに単語が含まれる場合
-
[解決済み] Notepad++で重複した行を削除する
-
[解決済み] SQLのインデックスとは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
SQLラーニングノート--オペランドには1つのカラムが必要です。
-
[解決済み] SQLテーブルで重複する値を検索する
-
[解決済み] 各GROUP BYグループの最初の行を選択しますか?
-
[解決済み] T-SQLでnot equalには!=と<>のどちらを使うべきですか?
-
[解決済み] SQL Server の VARCHAR/NVARCHAR 文字列に改行を挿入する方法
-
[解決済み] ある列の最大値を持つ行を取得する
-
[解決済み] SQL Serverで結果をページ分割する最も良い方法は何ですか?
-
[解決済み] 既存のカラムにIDを追加する
-
[解決済み] 複数の列に対してSELECT DISTINCTする方法(またはできる方法)は?
-
[解決済み] 小さなテーブルから重複した行を削除する