我有一个庞大的表--3600万行 - 在SQLite3中。</ p>
在这个非常大的表中,有两列
但是,有些行是重复的。也就是说,hash和d都具有相同的值。
另外,如果两个哈希值相同,则d值也相同,但两个相同的ds并不意味着两个相同的哈希值
无论如何,我想删除重复的行。我没有主键列。 最快的方法是什么?
编辑:delete from dist where rowid not in (select max(rowid) from dist group by hash);
似乎可以做到这一点。
答案 0 :(得分:105)
您需要一种区分行的方法。根据您的评论,您可以使用特殊的rowid column。
通过保持最低rowid
每(hash,d)
:
delete from YourTable
where rowid not in
(
select min(rowid)
from YourTable
group by
hash
, d
)
答案 1 :(得分:5)
我想最快的就是使用非常数据库:添加一个具有相同列的新表,但是有适当的约束(哈希/真实对上的唯一索引?),迭代原始表并尝试在新表中插入记录,忽略约束违规错误(即在引发异常时继续迭代)。
然后删除旧表并将新表重命名为旧表。
答案 2 :(得分:1)
如果添加主键不是一个选项,那么一种方法是将重复项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