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

Posted

技术标签:

【中文标题】从 sqlite 数据库中删除重复的行【英文标题】:Deleting duplicate rows from sqlite database 【发布时间】:2012-01-01 16:42:47 【问题描述】:

我在 SQLite3 中有一个巨大的表 - 3600 万行。在这个非常大的表中,有两列:

hash - 文字 d - 真实

有些行是重复的。也就是说,hashd 具有相同的值。如果两个哈希值相同,则d 的值也相同。但是,两个相同的d's 并不意味着两个相同的hash'es。

我想删除重复的行。我没有主键列。

最快的方法是什么?

【问题讨论】:

请将答案放在答案块中。稍后,您可以接受自己的答案。另见How does accepting an answer work? 【参考方案1】:

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

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

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

【讨论】:

SQLite 不允许您添加主键列,是吗? sqlite> alter table dist add id integer primary key autoincrement; Error: Cannot add a PRIMARY KEY column 有趣!您需要的部分是autoincrement,但如果您省略primary key 部分,它是否有效? delete from dist where rowid not in (select max(rowid) from dist group by hash); 似乎可以解决问题!谢谢。 又有趣了,不知道rowid!它将满足要求,因为该列必须是唯一且可比较的。我已经编辑了答案。【参考方案2】:

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

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

【讨论】:

我想,它不像简单地改变表格那么优雅,但你的方法的一个真正好处是你可以在不接触/破坏源数据的情况下多次重新运行它,直到您对结果非常满意。【参考方案3】:

如果添加主键不是一个选项,那么一种方法是将重复的 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

【讨论】:

+1,不确定 sqlite 是否支持delete <alias> from <table> <alias> 语法

以上是关于从 sqlite 数据库中删除重复的行的主要内容,如果未能解决你的问题,请参考以下文章

我如何从数据框中删除具有重复/重复索引的行[重复]

从 ListView(SQLite 数据库)中长按行删除

如何使用 SSIS 从平面文件中删除重复的行?

如何从文本文件中删除重复并包含某些单词的行?

SQLite3代码动态插入要删除的行数据的列值

根据条件从 r 中的多列中删除重复的行