2016-05-26 21 views
1

私はテーブルが2つあります:ユーザと結果。 ユーザテーブルには、結果テーブルに反映される重複データが含まれています。以下のユーザーは3回作成されます。 UserId 2と3の結果テーブルを更新して、すべての結果をこのユーザーだけで表示できるようにする必要があります。
私はいくつかのユーザーといくつかの結果しか持っていないと簡単ですが、私の場合は500人の重複ユーザーと30000件の結果があります。テーブル2の重複があるテーブル1のデータを更新します。

は、私はこれで任意の助けに感謝本当にうSQL Server Expressの2014

を使用しています!

編集:resultTableの誤った型の列名。あなたがそれによって混乱した場合、私は申し訳ありません。

UserTable  
UserId---Fname---LName 

1-----Georg-----Smith  
2-----Georg-----Smith  
3-----Georg-----Smith  

ResultsTable 

ResultId---UserRefId  
1-----1  
2-----2  
3-----3  
4-----1  

私はUSERTABLEから重複を選択するために管理してきたが、私はさらに進行するのか分かりません。

;WITH T AS  
( 
SELECT *, COUNT(*) OVER (PARTITION BY Fname + Lname) as Cnt  
    FROM TestDatabase.Users  
)  
SELECT Id, Fname, Lname  
FROM T  
WHERE Cnt > 2  
+0

使用しているSQL Serverのバージョンは何を参照してください? –

+0

SQL Server Express 2014 – zonaren

答えて

0

を削除することができますあなたがオンになっていますcteと正しいトラック。 ROW_NUMBER()関数を使用して重複したUserIdsをフラグすることができます。その後、更新ステートメントのfrom節にcteを追加して、置換するUserIdを見つけて、再度結合して、それらを置き換えるUserIdを見つけ出すことができます。

;WITH cteDedup AS(
    SELECT 
    UserId 
    ,FName 
    ,LName 
    ,ROW_NUMBER() OVER(PARTITION BY FName, LName ORDER BY UserID ASC) AS row_num 
    FROM UserTable 
) 

UPDATE rt 
SET UserId = original.UserId 
FROM ResultsTable rt 
JOIN cteDedup dupe 
    ON rt.UserId = dupe.UserId 
JOIN cteDedup original 
    ON dupe.FName = original.FName 
    AND dupe.LName = original.LName 
WHERE dupe.row_num <> 1 
    AND original.row_num = 1 

SQLFiddle

+0

信じられないほど!これは魅力的に機能しました。どうもありがとうございました。うまくいけば、これは他の人にも役立つでしょう。 – zonaren

+0

あなたが同じ名字のUserTableに2人の人がいる場合、これは正しく動作しません。より大きな組織では問題になる可能性があります。 – supergrady

+0

正常に動作しないとどういう意味ですか?私のテストデータベースではうまくいきました。 – zonaren

2

あなたResultTableは同じUserId名前を持つ2つの列があります。私は、以下のクエリに対してUserId2に2つ目の変更:

;WITH cte As 
    (
     SELECT  R.UserId, R.UserId2, 
        MIN(U.UserId) OVER (PARTITION BY U.FName, U.LName) As OriginalUserId 
     FROM  ResultTable  R 
     INNER JOIN UserTable  U  ON R.UserId = U.UserId 
    ) 


UPDATE cte 
    SET  UserId2 = OriginalUserId 
+0

ありがとうございます。私は今それを修正しました。そして答えに感謝します。私が家にいるとすぐに私はテストします。 – zonaren

0

少しトリッキーなクエリは次のようになります。

;with t as (
select fname+lname name,id, 
ROW_NUMBER() over(partition by fname+lname order by id) rn 
from #users 
) 
--for test purpose comment next 2 lines 
update #results 
set userid=t1.id 
--and uncomment the next one 
--select t.name,t.id,userid,res,t1.id id1--,(select top 1 id from t t1 where t1.name=t.name and t.rn=1) id1 
from t 
inner join #results r on t.id=r.userid 
inner join t t1 on t.name=t1.name and t1.rn=1 

そして、あなたが重複し、ユーザーに

;with t as (
select name,id, 
ROW_NUMBER() over(partition by name order by id) rn 
from #users 
) 
delete t where rn>1 
関連する問題