我有必须清理的数据库。有数百万条记录,我有重复记录(重复是那些具有相同第二列,C_DataSourceID
)的记录。根据第3栏C_DateCreated
,我需要删除除最新副本之外的所有副本。
我试图用这个:
SELECT C_EmailAddress, C_DataSourceID, C_DateCreated, count(*)
FROM duplicates GROUP BY C_DataSourceID
HAVING count(*) > 1
但是它会返回带有重复数量的重复项。有没有办法根据C_DataSourceID
得到所有,但是一个,重复?
我没有ID,但我可能会添加ID。到目前为止,数据库是空的,但它会有很多记录。我应该添加ID吗?我需要那些没有分组的记录。
答案 0 :(得分:2)
以下是使用ANSI SQL解决此问题的一种方法:
delete
from duplicates d
where not exists (select 1
from duplicates d2
where d2.C_DataSourceID = d.C_DataSourceID and
d2.C_DateCreated > d.C_DateCreated
)
但是,并非所有数据库都支持此语法。
答案 1 :(得分:1)
假设没有重复项具有相同的C_DateCreated:
select d.C_EmailAddress, d.C_DataSourceID, d.C_DateCreated
from duplicates as d
where d.C_DateCreated !=
(select max(d2.C_DateCreated)
from duplicates d2
where d2.C_DataSourceId = d.C_DataSourceId and
d.C_EmailAddress = d.C_EmailAddress)
不是最有效的做事方式,但它会起作用......