Eliminazione di righe duplicate da una tabella
-
20-08-2019 - |
Domanda
Ho una tabella nel mio database che ha record duplicati che voglio eliminare. Non voglio creare una nuova tabella con voci distinte per questo. Quello che voglio è eliminare le voci duplicate dalla tabella esistente senza la creazione di alcuna nuova tabella. C'è un modo per farlo?
id action
L1_name L1_data
L2_name L2_data
L3_name L3_data
L4_name L4_data
L5_name L5_data
L6_name L6_data
L7_name L7_data
L8_name L8_data
L9_name L9_data
L10_name L10_data
L11_name L11_data
L12_name L12_data
L13_name L13_data
L14_name L14_data
L15_name L15_data
vedi questi sono tutti i miei campi:
id è unico per ogni riga.
L11_data è unico per il rispettivo campo di azione.
L11_data sta avendo nomi di società mentre action sta avendo il nome dei settori.
Quindi nei miei dati ho un nome duplicato delle aziende in L11_data per i rispettivi settori.
Quello che voglio è avere un nome univoco e altri dati delle aziende nel settore specifico memorizzati in azione. Spero di aver dichiarato il mio problema in modo tale che tu possa capirlo.
Soluzione
Sì, supponendo che tu abbia un campo ID univoco, puoi eliminare tutti i record uguali tranne l'ID, ma non hanno " l'ID minimo " per il loro gruppo di valori.
Esempio di query:
DELETE FROM Table
WHERE ID NOT IN
(
SELECT MIN(ID)
FROM Table
GROUP BY Field1, Field2, Field3, ...
)
Note:
- Ho scelto liberamente " Tabella " e "ID" come nomi rappresentativi
- L'elenco dei campi (" Field1, Field2, ... ") dovrebbe includere tutti i campi tranne l'ID
- Potrebbe trattarsi di una query lenta a seconda del numero di campi e righe, tuttavia mi aspetto che vada bene rispetto alle alternative
MODIFICA: Nel caso in cui non si disponga di un indice univoco, la mia raccomandazione è semplicemente quella di aggiungere un indice univoco auto-incrementale. Principalmente perché ha un buon design, ma anche perché ti permetterà di eseguire la query sopra.
Altri suggerimenti
ALTER IGNORE TABLE 'table' ADD UNIQUE INDEX(your cols);
I duplicati ottengono NULL, quindi puoi eliminarli
DELETE
FROM table_x a
WHERE rowid < ANY (
SELECT rowid
FROM table_x b
WHERE a.someField = b.someField
AND a.someOtherField = b.someOtherField
)
WHERE (
a.someField,
a.someOtherField
) IN (
SELECT c.someField,
c.someOtherField
FROM table_x c
GROUP BY c.someField,
c.someOtherField
HAVING count(*) > 1
)
Nella query precedente la combinazione di someField e someOtherField deve identificare distintamente i duplicati.