Question

J'ai une table Access 2003 avec environ 4000 enregistrements qui a été créée à partir de 17 tables différentes. Environ la moitié de ces enregistrements sont des doublons. Il n'y a pas de colonne d'identification unique (id, nom, etc.). Il existe une colonne id qui était automatiquement renseignée lorsque les tables ont été combinées, ce qui signifie que les doublons ne sont pas complètement identiques (bien que cette colonne puisse être supprimée si cela simplifie les choses).

J'ai utilisé l'Assistant de recherche de recherche de doublons d'accès, qui me donne la liste des enregistrements dupliqués, mais ne me permet pas de les supprimer (à quoi sert cette requête si je ne peux pas les supprimer?). J'ai essayé de convertir la requête générée en une requête de suppression, mais cela modifie le nombre de lignes trouvées. Je modifierais manuellement le SQL, mais il dépasse un peu et mesure 7 lignes.

Quelqu'un connaît-il un bon moyen de se débarrasser des doublons?

Était-ce utile?

La solution

Si la requête de recherche de doublons ne vous permet pas de supprimer des enregistrements, c’est parce qu’il s’agit d’une requête globale, elle compte le nombre de doublons trouvés et renvoie les cas où le nombre est supérieur à 1.

Considérez que si vous effectuez une requête de suppression sur la base de la recherche des doublons, toutes les lignes contenant des valeurs en double seront supprimées, ce qui n’est peut-être pas ce que vous souhaitez. Vous souhaitez supprimer tous les doublons sauf un.

Vous devez essayer de supprimer tous les doublons d’un enregistrement sauf un, à l’exception de la colonne ID de votre comparaison. Je suggère que le moyen le plus simple de procéder consiste à interroger toutes les uniques. valeurs (sélectionnez Distinct Field1, Field2 ... dans MyTable) à la place de chaque champ sauf pour le champ ID, en utilisant les résultats dans a pour créer une nouvelle table d'environ 2000 enregistrements (si la moitié sont des doublons).

Ensuite, créez une colonne d'ID sur votre nouvelle table, utilisez une requête de mise à jour pour mettre à jour cet ID avec le premier ID correspondant dans la table d'origine (vous pouvez le faire en utilisant DLookup , qui renverra la première valeur EXPRESSION où CRITERIA a la valeur true dans DOMAIN ).

  

La fonction DLookup () renvoie un   valeur d'un seul champ même si plus   qu'un enregistrement satisfait à la   Critères. Si aucun enregistrement ne satisfait la   critères, ou si le domaine ne contient pas   enregistrements, DLookup () renvoie un Null.

Etant donné que vous identifiez le premier identifiant correspondant sur la base de tous les autres champs, qui sont des valeurs uniques, les identifiants sans correspondance appartiendront aux doublons. Vous allez inverser la relation PK, en identifiant la première clé correspondante en fonction d'un ensemble de champs uniques. Après cela, vous devez définir l'ID sur PK. Bien entendu, cela suppose que l'ID n'a pas de signification intrinsèque et que vous ne vous souciez pas de conserver un ID particulier pour une ligne dupliquée donnée par-dessus l'un des ID appartenant aux autres lignes dupliquées. Cela suppose que vous vous souciez des données de la colonne ID et que vous souhaitiez les conserver pour toutes les lignes restantes, sinon ignorez simplement l'étape DLookup et effectuez une sélection distincte sur toutes les colonnes, à l'exception de l'ID.

Autres conseils

Utilisez une sélection avec toutes les colonnes sauf la colonne ID:

SELECT DISTINCTROW Column1, Column2, Column3 
INTO MYNEWTABLE
FROM TABLE

Vous pouvez simplement échanger les noms.

Cette solution vous donnera un nouveau tableau avec des doublons.

Ce qui suit préservera les identifiants d'origine et le fera en une étape:

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

Vous avez maintenant la table d'origine sans doublons ni identifiants préservés. Et souvenez-vous toujours de sauvegarder vos données avant d’essayer de grands DELETE.

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
    )

En fait, j'ai trouvé une solution très simple qui a pris un certain temps, mais tous vos champs sont identiques, comme un enregistrement dupliqué complet, puis faites une requête avec chaque champ et triez-la par "Group BY". Ainsi, les doublons se combinent et vous pouvez simplement ajouter ces informations à une nouvelle table et les renommer de la même manière que la table existante. Si vous avez un champ de clé primaire, vous pouvez simplement l'ignorer dans la requête, puis combiner les données (en supposant que vous ne vous souciez pas des données du champ principal). Je ne sais pas pourquoi personne n'a mentionné cette solution m'a pris 5 heures. à venir avec. :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top