2009-08-17 11 views

risposta

26

Vedere la seguente domanda: Deleting duplicate rows from a table.

La risposta accettata adattato da lì (che è la mia risposta, in modo che nessun "furto" qui ...):

Si può fare in modo semplice a patto di avere un campo ID univoco: è possibile eliminare tutti i record che sono gli stessi ad eccezione dell'ID, ma non hanno "l'ID minimo" per il loro nome.

interrogazione Esempio:

DELETE FROM members 
WHERE ID NOT IN 
(
    SELECT MIN(ID) 
    FROM members 
    GROUP BY name 
) 

Nel caso in cui non si dispone di un indice univoco, la mia raccomandazione è quella di aggiungere semplicemente un indice univoco auto-incrementale. Principalmente perché è un buon design, ma anche perché ti permetterà di eseguire la query sopra.

+1

Ecco come ho capito quanto segue: Per ogni nome, li raggruppa (solo uno se è univoco, diversi in uno se duplicati), seleziona l'ID più piccolo dal set e quindi elimina qualsiasi riga il cui ID non esiste nella tabella . Fantastico :) Grazie mille Rax. – Gulbahar

+0

Hai capito esattamente :) –

+1

in mysql ottengo il seguente errore quando invio questa query: "" errore 1093 (HY000) ma dà un errore "Non puoi specificare i" membri "della tabella di destinazione per l'aggiornamento nella clausola FROM" "qualsiasi idea ? –

4

Probabilmente sarebbe più facile selezionare quelli unici in una nuova tabella, rilasciare la vecchia tabella, quindi rinominare la tabella temporanea per sostituirla.

#create a table with same schema as members 
CREATE TABLE tmp (...); 

#insert the unique records 
INSERT INTO tmp SELECT * FROM members GROUP BY name; 

#swap it in 
RENAME TABLE members TO members_old, tmp TO members; 

#drop the old one 
DROP TABLE members_old; 
+0

Grazie Paul. Per chi è interessato ... CREATE TEMP TABLE tmp_members (nome VARCHAR); INSERISCI IN tmp_members Nome SELECT FROM membri GROUP BY nome; SELECT COUNT (nome) FROM tmp_members; ELIMINA DA membri; membri VACUUM; SELECT COUNT (nome) FROM membri; INSERIRE nei membri (nome) SELECT * FROM tmp_members; SELECT COUNT (nome) FROM membri; SELECT DISTINCT COUNT (name) FROM members; nome SELECT FROM membri LIMIT 10; DROP TABLE tmp_members; – Gulbahar

+0

Mi spiace, ho perso il fatto che stavi usando SQLite! –

0

Abbiamo un enorme database in cui l'eliminazione dei duplicati fa parte del regolare processo di manutenzione. Usiamo DISTINCT per selezionare i record univoci, quindi li scriviamo in una TABELLA TEMPORANEA. Dopo TRUNCATE scriviamo i dati TEMPORANEI nella TABELLA.

Questo è un modo per farlo e funziona come PROCEDURA MEMORIZZATA.

+1

Devo ammettere che la risposta di Rax Olgud è molto più sofisticata e probabilmente funziona 100 volte più veloce! :) - Sto pensando di adottare la soluzione ... Merita +1! –

0

Se vogliamo vedere prima quali file stai per eliminare. Quindi cancellali.

with MYCTE as (
    SELECT DuplicateKey1 
     ,DuplicateKey2 --optional 
     ,count(*) X 
    FROM MyTable 
    group by DuplicateKey1, DuplicateKey2 
    having count(*) > 1 
) 
SELECT E.* 
FROM MyTable E 
JOIN MYCTE cte 
ON E.DuplicateKey1=cte.DuplicateKey1 
    AND E.DuplicateKey2=cte.DuplicateKey2 
ORDER BY E.DuplicateKey1, E.DuplicateKey2, CreatedAt 

esempio completa a http://developer.azurewebsites.net/2014/09/better-sql-group-by-find-duplicate-data/

0

cancellare fila DUP mantenere una tabella ha le righe duplicate e possono essere alcune righe non hanno righe duplicate allora tenere uno righe se hanno duplicato o singola in una tabella. La tabella ha due id di colonna e nome se dobbiamo rimuovere il nome duplicato dalla tabella e mantenerne uno. La sua fine lavoro alla mia fine Devi usare questa query.

DELETE FROM tablename 
WHERE id NOT IN(

SELECT id FROM 
(
    SELECT MIN(id)AS id 
    FROM tablename 
    GROUP BY name HAVING 
    COUNT(*) > 1 
)AS a) 
AND id NOT IN(
(SELECT ids FROM 
(
SELECT MIN(id)AS ids 
    FROM tablename 
    GROUP BY name HAVING 
    COUNT(*) =1 
)AS a1 
) 
) 

prima tabella di eliminazione è al di sotto vedere lo screenshot: enter image description here dopo la tabella di cancellazione è inferiore a vedere lo screenshot questa query eliminare Amit e Akhil righe duplicate e mantenere un record (Amit e Akhil):

enter image description here

0

È possibile partecipare a tavola con te stesso campo abbinati ed eliminare righe unmatching

DELETE t1 FROM table_name t1 
LEFT JOIN tablename t2 ON t1.match_field = t2.match_field 
WHERE t1.id <> t2.id; 
Problemi correlati