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?

È stato utile?

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. :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top