从sqlite数据库中删除重复的行

我有一个巨大的表 – 3600万行 – 在SQLite3。

在这个非常大的表中,有两列

  • 散列 – 文本
  • d – 真实

但是,一些行是重复的。 也就是说,哈希和d都具有相同的值。

另外,如果两个哈希值相同,则d的值也是相同的,但是两个相同的ds并不意味着两个相同的哈希值

无论如何,我想删除重复的行。 我没有主键列,因为我是个白痴。 什么是最快的方法来做到这一点?


编辑: delete from dist where rowid not in (select max(rowid) from dist group by hash);

似乎做的伎俩。

您需要一种方法来区分行。 根据你的评论,你可以使用特殊的rowid列 。

通过保留最低rowid (hash,d)来删除重复项:

 delete from YourTable where rowid not in ( select min(rowid) from YourTable group by hash , d ) 

我猜最快的将是使用它的数据库:添加一个新的表具有相同的列,但具有适当的约束(哈希/真正的对唯一索引?),迭代通过原始表,并尝试插入logging新的表,忽略违反约束的错误(例如,当引发exception时继续迭代)。

然后删除旧表并将新的名称重命名为旧的。

如果添加主键不是一个选项,则一种方法是将重复的DISTINCT存储在临时表中,从现有表中删除所有重复的logging,然后将logging从临时表中重新添加到原始表中。

例如(为SQL Server 2008编写,但技术对于任何数据库都是相同的):

 DECLARE @original AS TABLE([hash] varchar(20), [d] float) INSERT INTO @original VALUES('A', 1) INSERT INTO @original VALUES('A', 2) INSERT INTO @original VALUES('A', 1) INSERT INTO @original VALUES('B', 1) INSERT INTO @original VALUES('C', 1) INSERT INTO @original VALUES('C', 1) DECLARE @temp AS TABLE([hash] varchar(20), [d] float) INSERT INTO @temp SELECT [hash], [d] FROM @original GROUP BY [hash], [d] HAVING COUNT(*) > 1 DELETE O FROM @original O JOIN @temp T ON T.[hash] = O.[hash] AND T.[d] = O.[d] INSERT INTO @original SELECT [hash], [d] FROM @temp SELECT * FROM @original 

我不知道如果sqlite有一个ROW_NUMBER()types的函数,但如果这样做,你也可以尝试一些在这里列出的方法: 从一个SQL表删除重复的logging没有主键