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

时间:2011-11-18 23:45:11

标签: sql database sqlite

我有一个庞大的表--3600万行 - 在SQLite3中。<​​/ p>

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

  • hash - text
  • d - 真实

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

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

无论如何,我想删除重复的行。我没有主键列。 最快的方法是什么?


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

似乎可以做到这一点。

3 个答案:

答案 0 :(得分:105)

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

通过保持最低rowid(hash,d)

来删除重复项
delete   from YourTable
where    rowid not in
         (
         select  min(rowid)
         from    YourTable
         group by
                 hash
         ,       d
         )

答案 1 :(得分:5)

我想最快的就是使用非常数据库:添加一个具有相同列的新表,但是有适当的约束(哈希/真实对上的唯一索引?),迭代原始表并尝试在新表中插入记录,忽略约束违规错误(即在引发异常时继续迭代)。

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

答案 2 :(得分:1)

如果添加主键不是一个选项,那么一种方法是将重复项DISTINCT存储在临时表中,从现有表中删除所有重复记录,然后将记录添加回原始表中临时表。

例如(为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()类型函数,但是如果它有,你也可以尝试这里列出的一些方法:Delete duplicate records from a SQL table without a primary key