如何在SQLite中删除重复项?

27

我有一个SQLite数据库,其中包含以下语句:

SELECT messdatum, count(*) as anzahl 
from lipo 
GROUP BY Messdatum 
ORDER BY anzahl desc;

结果显示有重复行,这意味着我有一些具有相同 Messdatum 的重复项。如何仅从我的sqlite数据库中删除重复项?(应该删除 messdatum 相同的 anzahl-1 条记录吗?)有人有建议吗?

PS:我找到了这个链接如何从Microsoft中删除重复项但是在sqlite方言上遇到了问题。由于sqlite语法错误,我遇到了一些错误。例如:

 INSERT into holdkey SELECT messdatum, count(*) as anzahl from lipo group by messdatum having count(*) > 1;

 INSERT into holddups SELECT DISTINCT lipo.* from lipo, holdkey where lipo.Messdatum = holdkey.messdatum ;

 DELETE lipo from lipo, holdkey where lipo.messdatum = holdkey.messdatum;

删除命令出现错误,我该怎么做?我试图将holdkey.anzahl更新到lipo的另一列中。

UPDATE lipo,holdkey set lipo.duplettenzahl = holdkey.anzahl WHERE lipo.messdatum = holdkey.messdatum ; 

但这也是不可能的。 如果我在lipo中有anzahl作为dublettenzahl,我可以删除所有dublettenzahl > 0的记录。 请帮忙! 谢谢


2个回答

70

SQLite默认在每个表上创建一个特殊列,ROWID(您可以使用WITHOUT ROWID修饰符关闭它,但在这样做之前一定要非常确定)。

这意味着我们可以在重复集合中标识特定行,例如查找某个值的第一个条目:

SELECT messdatum, MIN(ROWID) FROM lipo

所以消除重复项的一种方法可能是这样的:
DELETE FROM lipo
WHERE rowid NOT IN (
  SELECT MIN(rowid) 
  FROM lipo 
  GROUP BY messdatum
)

3
有没有特定的原因不使用通常的主键字段,比如 id(如果存在),而是使用 ROWID - phil294

1
我得到了解决方案:
 INSERT into holdkey SELECT messdatum, count(*) as anzahl,NameISO from lipo group by messdatum having count(*) > 1;
 INSERT into holddups SELECT DISTINCT lipo.*,1 from lipo, holdkey where lipo.Messdatum = holdkey.messdatum group by messdatum;
 INSERT into lipo_mit_dz  SELECT *, count(*) as DublettenZahl from lipo group by messdatum ORDER BY Dublettenzahl desc ;
 DELETE from lipo_mit_dz where Dublettenzahl > 1;
 INSERT into lipo_mit_dz SELECT * from holddups ; 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接