Pergunta

Eu tenho uma tabela do Access 2003 com ~ 4000 registros que foi feita a partir de 17 tabelas diferentes. Cerca de metade desses registros são duplicados. Não há nenhuma coluna de identificação único (id, nome etc). Há uma coluna id que foi auto preenchido quando as tabelas foram combinados o que significa que as duplicatas não são completamente idênticos (embora esta coluna pode ser removido se ele faz as coisas mais fáceis).

Eu tenho usado o Acesso Localizar duplicatas Assistente de consulta que me dá uma lista dos registros duplicados, mas não me deixa apagá-los (a sério o que uso é esta consulta se eu não posso excluí-los?). Eu tentei converter a consulta gerada para uma consulta remover mas que muda o número de linhas que encontrar. Eu alterar o sql à mão, mas é um pouco além de mim e é de 7 linhas.

Alguém sabe uma boa maneira de se livrar das duplicatas?

Foi útil?

Solução

A razão a encontrar duplicatas consulta não vai deixar você excluir os registros é porque é basicamente apenas uma consulta agregada, ele está contando o número de duplicatas que encontra e retornando os casos em que a contagem é maior que 1.

Considere que se você fez uma consulta de exclusão com base nos duplicados encontrar, ele iria excluir todas as linhas que têm valores duplicados, o que talvez não seja o que você quer. Você quer apagar tudo, mas uma das duplicatas.

Você deve tentar apagar todas as cópias de um registro para além de um, excluindo a coluna ID na sua comparação. Eu sugiro que a maneira mais simples de fazer isso é fazer uma consulta criar tabela de toda a única valores (select distinct Field1, Field2 ... a partir de MyTable) em vez para cada campo exceto para o campo ID, utilizando os resultados em uma para criar uma nova tabela de cerca de 2000 registros (se metade são duplicatas).

Em seguida, crie uma coluna de identificação na sua nova tabela, use uma consulta atualização para atualizar esta ID para o primeiro ID correspondente na tabela original (você pode fazer isso usando o DLookup , que irá retornar o primeiro valor EXPRESSÃO onde CRITÉRIOS é verdade no domínio ).

A função DLookup () retorna um valor de um único campo, mesmo se mais de um satisfaz gravar as critério. Se não satisfaz gravar a critérios, ou se o domínio não contém registros, DLookup () retorna um valor nulo.

Uma vez que você está identificando o primeiro ID de correspondência com base em todos os outros campos, que são valores únicos, os IDs incomparáveis ??pertencerá a duplicatas. Você vai estar a inverter a relação PK, identificando a primeira chave correspondente dado um conjunto de campos exclusivos. Depois disso, você deve definir o ID para ser PK. É claro que este assume o ID não tem nenhum significado inerente, e você não se importa em manter um ID específico para uma determinada linha duplicada sobre qualquer um dos IDs pertencentes aos demais linhas duplicadas. Isso pressupõe que você se preocupam com os dados na coluna ID assim que você quer preservá-lo para todas as linhas restantes, caso contrário, simplesmente ignorar o passo DLookup e fazer um select distinct em todas as colunas além do ID.

Outras dicas

Use uma seleção com todas as colunas exceto a coluna ID:

SELECT DISTINCTROW Column1, Column2, Column3 
INTO MYNEWTABLE
FROM TABLE

Você pode simplesmente trocar os nomes.

Esta solução irá dar-lhe uma nova tabela com os não duplicados.

A seguir irá preservar IDs originais e fazê-lo em uma única etapa:

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

Agora você tem a tabela original, sem duplicatas e ids preservadas. E lembre-se sempre de backup que você os dados antes de tentar grandes DELETEs.

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
    )

Na verdade eu encontrei uma solução muito simples demorou um pouco, mas todos os seus campos em toda são os mesmos como um registro duplicado completa, em seguida, basta fazer uma consulta com todos os campos e classificar por "GROUP BY". Assim, as duplicatas irão se juntar e você pode simplesmente anexar essas informações para uma nova tabela e renomeá-lo o mesmo que a tabela existente. Se você tem um campo de chave primária que você poderia simplesmente ignorá-la na consulta e, em seguida, seria ainda combinar os dados (supondo que você não se preocupam com os dados no campo primário). Eu não sei por que ninguém tenha mencionado esta solução me levou 5 horas. inventar. :)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top