2015-10-07 183 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。