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

新手上路,请多包涵

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

  • hash - 文字
  • d - 真实

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

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

最快的方法是什么?

原文由 Patches 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 871
2 个回答

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

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

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

原文由 Andomar 发布,翻译遵循 CC BY-SA 3.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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题