如何在SQLite中删除重复项?

时间:2014-09-17 06:52:51

标签: sqlite sql-delete

我有一个SQLite DB语句:

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

会产生一些行,这表示我有一些重复的Messdatum。 如何从我的sqlite db中删除重复项? (它应该删除anzahl-1记录,其中messdatum是相同的吗?)有人有建议吗?

PS:我发现此链接How to remove duplicate from Microsoft但是sqlite方言存在问题。由于sqlite语法,我得到了一些错误。 所以f.e.我能做到:

 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;

这是delete命令的错误。我怎样才能做到这一点?我尝试使用

将holdkey.anzahl更新为lipo中的另一个col
UPDATE lipo,holdkey set lipo.duplettenzahl = holdkey.anzahl WHERE lipo.messdatum = holdkey.messdatum ; 

但这也是不可能的。如果我将脂肪中的anzahl作为dublettenzahl,我可以删除所有来自lipo的记录,其中dublettenzahl> 0.请帮忙!感谢

2 个答案:

答案 0 :(得分:24)

默认情况下,SQLite在每个表上都创建了special column, ROWID(您可以switch it off使用WITHOUT ROWID修饰符,但在此之前要非常肯定。)

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

SELECT messdatum, MIN(ROWID) FROM lipo

因此,删除重复项的一种方法可能是:

DELETE FROM lipo
WHERE rowid NOT IN (
  SELECT MIN(rowid) 
  FROM lipo 
  GROUP BY messdatum
)

答案 1 :(得分:0)

我得到了解决方案:

 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 ;