我在 SQLite3 中有一个巨大的表 - 3600 万行。在这个非常大的表中,有两列:
hash
- 文字d
- 真实
有些行是重复的。也就是说, hash
和 d
具有相同的值。如果两个哈希值相同,那么 d
的值也是相同的。但是,两个相同的 d
并不意味着两个相同的 hash
。
我想删除重复的行。我没有主键列。
最快的方法是什么?
原文由 Patches 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果添加主键不是一个选项,那么一种方法是将重复的 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
原文由 rsbarro 发布,翻译遵循 CC BY-SA 3.0 许可协议
1 回答2.6k 阅读✓ 已解决
1 回答1.9k 阅读
1 回答856 阅读
642 阅读
1 回答243 阅读✓ 已解决
您需要一种区分行的方法。根据您的评论,您可以为此使用特殊的 rowid 列。
要通过保持最低
rowid
每(hash,d)
来删除重复项: