我有一個用戶列表(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