Eliminazione dei duplicati in Access 2003
-
05-07-2019 - |
Domanda
Ho una tabella di Access 2003 con ~ 4000 record creata da 17 diverse tabelle. Circa la metà di questi record sono duplicati. Non esiste una colonna identificativa univoca (ID, nome ecc.). C'è una colonna id che è stata compilata automaticamente quando le tabelle sono state combinate, il che significa che i duplicati non sono completamente identici (anche se questa colonna potrebbe essere rimossa se rendesse le cose più facili).
Ho usato la Procedura guidata per la ricerca di accessi duplicati che mi fornisce un elenco dei record duplicati ma non mi consente di eliminarli (seriamente a che serve questa query se non riesco a eliminarli?). Ho provato a convertire la query generata in una query di rimozione, ma ciò modifica il numero di righe che trova. Modificherei SQL manualmente, ma è un po 'oltre me ed è lungo 7 righe.
Qualcuno conosce un buon modo per sbarazzarsi dei duplicati?
Soluzione
Il motivo per cui la query Trova duplicati non ti consente di eliminare i record è perché è fondamentalmente solo una query aggregata, sta contando il numero di duplicati trovati e restituendo i casi in cui il conteggio è maggiore di 1.
Considera che se hai fatto una query di eliminazione basata sui trova duplicati, eliminerebbe tutte le righe che hanno valori duplicati, che forse non è quello che desideri. Vuoi eliminare tutti i duplicati tranne uno.
Dovresti provare a eliminare tutti i duplicati di un record tranne uno, esclusa la colonna ID nel tuo confronto. Suggerisco che il modo più semplice per farlo sia quello di rendere unica una query di make-table di tutti i valori (Seleziona Distinct Field1, Field2 ... da MyTable) invece per ogni campo tranne per il campo ID, usando i risultati in a per creare una nuova tabella di circa 2000 record (se la metà sono duplicati).
Quindi, crea una colonna ID sulla tua nuova tabella, usa una query di aggiornamento per aggiornare questo ID al primo ID corrispondente nella tabella originale (puoi farlo usando DLookup , che restituirà il primo valore EXPRESS in cui CRITERIA è vera in DOMAIN ).
La funzione DLookup () ne restituisce una valore da un singolo campo anche se di più di un record soddisfa il criteri. Se nessun record soddisfa il criteri o se il dominio contiene n record, DLookup () restituisce un valore Null.
Poiché stai identificando il primo ID corrispondente in base a tutti gli altri campi, che sono valori univoci, gli ID non corrispondenti apparterranno ai duplicati. Invertirai la relazione PK, identificando la prima chiave corrispondente data una serie di campi univoci. Successivamente, è necessario impostare l'ID su PK. Naturalmente questo presuppone che l'ID non abbia un significato intrinseco e non ti interessa mantenere un ID specifico per una determinata riga duplicata su uno degli ID appartenenti alle altre righe duplicate. Ciò presuppone che ti interessino i dati nella colonna ID, quindi desideri preservarli per tutte le righe rimanenti, altrimenti ignora semplicemente il passaggio DLookup ed esegui un Seleziona distinto su tutte le colonne tranne l'ID.
Altri suggerimenti
Usa una selezione con tutte le colonne tranne la colonna ID:
SELECT DISTINCTROW Column1, Column2, Column3
INTO MYNEWTABLE
FROM TABLE
Puoi semplicemente scambiare i nomi.
Questa soluzione ti darà una nuova tabella con non duplicati.
Quanto segue conserverà gli ID originali e lo farà in un solo passaggio:
DELETE FROM table_with_duplicates
WHERE table_with_duplicates.id NOT IN
(SELECT max(id)
FROM table_with_duplicates
GROUP BY duplicated_field_1, duplicated_field_2, ...
)
Ora hai la tabella originale senza duplicati e ID conservati. E ricorda sempre di eseguire il backup dei dati prima di provare DELETE di grandi dimensioni.
DELETE * FROM table_with_duplicates
WHERE table_with_duplicates.ID In
(SELECT max(ID)
FROM table_with_duplicates
GROUP BY [duplicated_field_1]
HAVING Count(*)>1
)
In realtà ho trovato una soluzione molto semplice ma ci sono voluti tutti i campi attraverso lo stesso di un record duplicato completo, quindi fai una query con ogni campo e ordina per " Gruppo BY " ;. Quindi i duplicati si combinano e puoi semplicemente aggiungere queste informazioni a una nuova tabella e rinominarle come la tabella esistente. Se si dispone di un campo chiave primaria, è possibile semplicemente ignorarlo nella query e quindi combinerebbe comunque i dati (supponendo che non vi interessino i dati nel campo primario). Non so perché nessuno abbia menzionato questa soluzione mi ha richiesto 5 ore. a venire con. :)