为了账号安全,请及时绑定邮箱和手机立即绑定

从sqlite数据库删除重复的行

从sqlite数据库删除重复的行

绝地无双 2019-11-26 11:23:36
我在SQLite3中有一个巨大的表-3600万行。在这个很大的表中,有两列:hash -文字d -真实一些行是重复的。也就是说,两者hash和d具有相同的值。如果两个哈希值相同,则的值也相同d。但是,两个相同的d'并不意味着两个相同hash'。我想删除重复的行。我没有主键列。最快的方法是什么?
查看完整描述

3 回答

?
www说

TA贡献1775条经验 获得超8个赞

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


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


delete   from YourTable

where    rowid not in

         (

         select  min(rowid)

         from    YourTable

         group by

                 hash

         ,       d

         )


查看完整回答
反对 回复 2019-11-26
?
狐的传说

TA贡献1804条经验 获得超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()类型函数,但是如果这样做,您还可以尝试此处列出的一些方法:从没有主键的SQL表中删除重复的记录


查看完整回答
反对 回复 2019-11-26
  • 3 回答
  • 0 关注
  • 1002 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信