2015-10-07 136 views
0

我有一个用户列表(Field = UserName),我从表(用户)获得。有些是重复的。根据条件删除记录

如果有重复的记录,我需要删除创建的最新记录(CreatedOn)。

此外,如果因为在数据库中存在'建立到此用户标识的关系'而删除删除功能,我需要它跳到下一条记录并继续删除。

我该如何做到这一点?

回答

1

从Diego的答案中检查UserName是否不是表中最早的实例。

DELETE FROM 
    Users 
WHERE 
    UserName IN 
    (SELECT UserName FROM Users GROUP BY UserName HAVING COUNT(UserName) > 1) 
    AND 
    CreatedOn != 
    (SELECT MIN(CreatedOn) FROM Users T1 WHERE UserName = T1.UserName); 
+0

这将删除包含他想保留的记录的重复项。 – sagi

+0

最后两行代码将避免删除原始文件,方法是确保只删除与最旧条目不同的日期的匹配用户名记录。原来的(最古老的)将被保留。 – MattBosten

0

你可以尝试这样的事情:

Delete from Users 
where nameuser in 
(select nameuser from Users 
Group by nameuser 
Having count(nameuser) > 1) 
+0

将删除重复名称的所有实例。但其中一个应该保留。 – jarlh

0

使用EXISTS删除行,如果相同的用户名也有一个较旧的CreatedOn:

delete from users u1 
where exists (select 1 from users u2 
       where u2.UserName = u1.UserName 
       and u2.CreatedOn < u1.CreatedOn) 

或者,另一种方法:

delete from users 
where (UserName, CreatedOn) not in (select UserName, MIN(CreatedOn) 
            from users 
            group by UserName) 
+0

第一个将不起作用,因为它会删除没有重复的每条记录。第二个将工作只有在可能只有一个重复,但可以说有3个记录具有相同的ID,它不会工作。 – sagi

+0

哎呀,谢谢......我在想什么......很快就需要更多咖啡,先编辑! – jarlh

0
DELETE from user u 
WHERE u.UserId in (SELECT Distinct userid from User u join User u2 where u.UserName = u2.UserName 
and u.CreatedOn > u2.CreatedOn) 

不能对错误跳过一个SQL,但你可以排除存在相关表中的用户ID。