更新table1中的数据,其中table2

时间:2016-05-26 01:55:03

标签: sql sql-server database

我有2个表:用户和结果。 usertable包含重复数据,反映在结果表中。下面的用户创建了3次。我需要将UserId 2和3的结果表更新为1,以便只能在此用户上查看所有结果。
如果我只有少量用户和一些结果,这很容易,但在我的情况下,我有500个重复用户和30000个结果。

我正在使用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     

3 个答案:

答案 0 :(得分:2)

您的ResultTable有两列,名称相同UserId。我将第二个更改为UserId2以进行下面的查询:

;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

答案 1 :(得分: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

答案 2 :(得分:0)

你与cte走在正确的轨道上。 ;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 函数可用于标记重复的UserIds,然后您可以将cte加入update语句的from子句中以查找要替换的UserIds,然后再次加入以查找要替换它们的UserIds用。

{{1}}

请参阅SQLFiddle