您好我有一个重复用户名的登录表。 是的我知道我应该对它施加约束,但现在已经太晚了!
基本上我想要做的就是首先确定重复项。我无法删除它们,因为我无法确定哪个帐户是正确的帐户。帐户具有相同的用户名,并且两者都具有大致相同的信息,并且具有一些小的差异。
有没有办法有效地编写脚本,以便我可以添加" _duplicate"每个副本只有一个帐户?
答案 0 :(得分:1)
您可以在ROW_NUMBER
子句中使用PARTITION BY
和OVER()
来查找重复项,并使用可更新的CTE来相应地更改值:
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
答案 1 :(得分:0)
没有简单的方法可以摆脱这场噩梦。需要一些手动操作。
首先确定重复。
select * from dbo.users
where userId in
(select userId from dbo.users
group by username
having count(userId) > 1)
接下来确定"无用"用户(例如注册但从未下过任何订单的用户)
重新运行上面的查询。在此列表中找到相同的重复项(例如通过电子邮件)并将它们组合在一个记录中。如果他们之前做了一些有用的事情(例如下达订单),那么首先将这些订单分配给幸存的用户。删除其他人。
继续其他标准,直到你摆脱重复
然后在unique
字段上设置username
约束。另外,最好在unique
字段上设置email
约束
同样,这并不容易,也不是自动的。
答案 2 :(得分:0)
In this case where you duplicates and the original names have some variance it is highly impossible to select non duplicate rows since you are not aware which is real and which is duplicate.
I think the best thing to is to correct you data and then fix from where you are getting this slight variant duplicates.