我有一个用户列表(Field = UserName),我从表(用户)获得。有些是重复的。根据条件删除记录
如果有重复的记录,我需要删除创建的最新记录(CreatedOn)。
此外,如果因为在数据库中存在'建立到此用户标识的关系'而删除删除功能,我需要它跳到下一条记录并继续删除。
我该如何做到这一点?
我有一个用户列表(Field = UserName),我从表(用户)获得。有些是重复的。根据条件删除记录
如果有重复的记录,我需要删除创建的最新记录(CreatedOn)。
此外,如果因为在数据库中存在'建立到此用户标识的关系'而删除删除功能,我需要它跳到下一条记录并继续删除。
我该如何做到这一点?
从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);
你可以尝试这样的事情:
Delete from Users
where nameuser in
(select nameuser from Users
Group by nameuser
Having count(nameuser) > 1)
将删除重复名称的所有实例。但其中一个应该保留。 – jarlh
使用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)
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。
这将删除包含他想保留的记录的重复项。 – sagi
最后两行代码将避免删除原始文件,方法是确保只删除与最旧条目不同的日期的匹配用户名记录。原来的(最古老的)将被保留。 – MattBosten