我有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
答案 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