2017-12-18 21 views
1

こんにちは私はいくつかの重複したユーザー名を持つログインテーブルを持っています。 はい、私はそれに制約を入れておくべきであることを知っていますが、それはちょっと遅すぎます!T-SQLで重複を取り除く方法

本質的に私がしたいことは、重複を最初に特定することです。どのアカウントが正しいアカウントなのかわからないので削除できません。アカウントには同じユーザー名があり、どちらもほぼ同じ情報を持ち、わずかなばらつきがあります。

効率的にスクリプトを作成する方法はありますか?複製ごとに1つのアカウントにのみ「_duplicate」を追加できますか?

+0

あなたは重複を特定しましたか?ご質問はありますか? –

答えて

1

あなたはそれに応じて値を変更するには、重複して更新可能CTEを見つけるために、OVER()句のPARTITION BYROW_NUMBERを使用することができます。

DECLARE @dummyTable TABLE(ID INT IDENTITY, UserName VARCHAR(100)); 
INSERT INTO @dummyTable VALUES('Peter'),('Tom'),('Jane'),('Victoria') 
          ,('Peter')  ,('Jane') 
          ,('Peter'); 
WITH UpdateableCTE AS 
(
    SELECT t.UserName AS OldValue 
      ,t.UserName + CASE WHEN ROW_NUMBER() OVER(PARTITION BY UserName ORDER BY ID)=1 THEN '' ELSE '_duplicate' END AS NewValue 
    FROM @dummyTable AS t 
) 
UPDATE UpdateableCTE SET OldValue = NewValue; 

SELECT * FROM @dummyTable; 

結果

ID UserName 
1 Peter 
2 Tom 
3 Jane 
4 Victoria 
5 Peter_duplicate 
6 Jane_duplicate 
7 Peter_duplicate 

あなたはROW_NUMBER()などが含まれる場合があります重複序数を見つける別の列。 1で番号が付けられた最も早い(または現在のものでなければならない)ソート条項がある場合は、重複を見つけて修正するのが簡単です。

この混乱をきれいにしたら、新しいダンプを取得しないようにする必要があります。しかし、あなたはすでにこれを知っています: - D

0

この悪夢を取り除く簡単な方法はありません。いくつかの手動操作が必要です。
最初に重複を識別します。

select * from dbo.users 
where userId in 
(select userId from dbo.users 
    group by username 
    having count(userId) > 1) 

次に、「役に立たない」ユーザー(登録したが、決して注文しないユーザーなど)を特定します。
上記のクエリを再実行してください。このリストの中で同じ(電子メールなど)の重複を見つけて、それらを1つのレコードにまとめます。彼らが以前に有用だったもの(例えば発注された注文)をした場合は、まずこれらの注文を生き残るユーザーに割り当てます。他を削除します。
重複を取り除くまで、他の基準を続行してください。
uniqueusernameフィールドに設定します。また、emailフィールドにuniqueという制約を設定することをお勧めします。
また、簡単ではなく自動ではありません。

0

複製する元の名前に多少の差異がある場合は、どちらが本物で、どちらが重複しているかわからないため重複していない行を選択することは非常に不可能です。

私は、あなたのデータを修正して、このわずかなバリアントの複製をどこから取得しているのかを確認することをお勧めします。

+0

あなたが質問を読んだ場合、OPの必要性は、あなたが記述したものです(重複を特定し、手動で再処理する)。しかし、問題は:これはどのようにすることができますか? – Shnugo

関連する問題