2014-09-17 22 views
5

Ho un DB SQLite in cui la dichiarazione:come posso eliminare i duplicati in SQLite?

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

risultati in alcune linee, il che indica che ho alcuni duplicati con lo stesso Messdatum. Come posso eliminare i duplicati solo dal mio sqlite db? (Dovrebbe cancellare i record anzahl-1 in cui il messdatum è lo stesso?) Qualcuno ha un consiglio?

PS: Ho trovato questo collegamento How to remove duplicate from Microsoft ma ho problemi con il dialetto sqlite. Ho alcuni errori dovuti alla sintassi sqlite. Quindi f.e. Potrei fare:

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; 

qui è un errore nel comando di cancellazione. Come lo posso fare? Ho provato ad aggiornare il holdkey.anzahl a un ulteriore col in lipo con

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

ma anche questo non è possibile. Se avessi l'anzahl come dublettenzahl a lipo, potrei cancellare tutti i record da lipo dove dublettenzahl> 0. Per favore aiuto! Grazie

risposta

10

SQLite ha un special column, ROWID creato su ogni tavolo di default (è possibile switch it off usando il modificatore WITHOUT ROWID, ma essere molto sicuro prima di farlo).

Questo significa che siamo in grado di identificare le righe specifiche all'interno di insiemi di duplicati, ad esempio, trovare la prima voce per un valore:

SELECT messdatum, MIN(ROWID) FROM lipo 

Quindi un modo per rimuovere i duplicati potrebbe essere questo:

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

Grazie mille! Grande! Potrei farlo anche in MySQL, vedi sotto la mia risposta. –

+0

Sfortunatamente la tua soluzione intelligente non funziona in MySQL (ma funziona perfettamente in SQLlite!) (Anche quando ho una riga PZEILE con un numero intero univoco nel mio DB MYSQL) ho ricevuto l'errore: [Err] 1093 - Non puoi specificare la tabella di destinazione 'lipo' per l'aggiornamento nella clausola FROM –

+1

Bene, la domanda fa riferimento solo a SQLite :-) Penso che sia probabilmente meglio porre di nuovo la domanda, ma riferendoci a MySQL in questo momento - la maggior parte dei database SQL ha le proprie variazioni idiosincratiche su " standard "SQL, sfortunatamente. –

0

ho ottenuto la soluzione:

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 ;