从sqlite数据库中删除重复行

从sqlite数据库中删除重复行,sql,database,sqlite,Sql,Database,Sqlite,我在SQLite3中有一个巨大的表——3600万行。在这个非常大的表中,有两列: 散列文本 d-实数 有些行是重复的。也就是说,hash和d都具有相同的值。如果两个哈希相同,那么d的值也相同。然而,两个相同的d并不意味着两个相同的散列 我想删除重复的行。我没有主键列 最快的方法是什么?如果不选择添加主键,那么一种方法是将重复项以不同方式存储在临时表中,从现有表中删除所有重复记录,然后从临时表中将记录添加回原始表中 例如,它是为SQL Server 2008编写的,但其技术对于任何数据库都是相同的

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

散列文本 d-实数 有些行是重复的。也就是说,hash和d都具有相同的值。如果两个哈希相同,那么d的值也相同。然而,两个相同的d并不意味着两个相同的散列

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


最快的方法是什么?

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

例如,它是为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是否有行数类型函数,但如果有,您也可以尝试下面列出的一些方法:

您需要一种区分行的方法。根据你的评论,你可以用特价

要通过保持每个哈希的最低rowid来删除重复项,请执行以下操作:


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


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

+1,不确定sqlite是否支持从语法中删除,尽管sqlite不允许添加主键列,是吗?sqlite>alter table dist add id integer primary key autoincrement;错误:无法添加主键!但是,您需要的部分是自动增量,如果省略主键部分,它是否有效?sqlite>alter table dist add id integer autoincrement;错误:接近自动增量:语法错误编辑:SQLite确实有一个rowid伪列类型thingy自动存在,我可以使用它吗?从dist删除,其中rowid不在按哈希从dist组中选择maxrowid;似乎是在耍花招!谢谢。我想这并不像简单地修改表格那么优雅,但你的方法有一个真正的好处,那就是你可以随意多次重新运行它,而无需接触/破坏源数据,直到你对结果非常满意为止。请将答案放在答案块中。稍后,你可以接受自己的答案。也看到
delete   from YourTable
where    rowid not in
         (
         select  min(rowid)
         from    YourTable
         group by
                 hash
         ,       d
         )