如何选择除一个之外的所有重复项?

时间:2014-07-21 11:36:10

标签: sql sqlite

我有必须清理的数据库。有数百万条记录,我有重复记录(重复是那些具有相同第二列,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吗?我需要那些没有分组的记录。

2 个答案:

答案 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)

不是最有效的做事方式,但它会起作用......