6
votes

Suppression de duplicats dans Access 2003

J'ai une table d'accès 2003 avec ~ 4000 enregistrements fabriqués à partir de 17 tables différentes. Environ la moitié de ces enregistrements sont des duplicats. Il n'y a pas de colonne d'identification unique (ID, nom, etc.). Il y a une colonne d'identité qui a été remplie automatiquement lorsque les tables ont été combinées au sens que les duplicats ne sont pas complètement identiques (bien que cette colonne puisse être retirée si cela facilite les choses).

J'ai utilisé l'assistant d'accès à la requête Duplicate qui me donne une liste des enregistrements dupliqués mais ne me laisserai pas les supprimer (sérieusement quelle utilisation est cette requête si je ne peux pas les supprimer?). J'ai essayé de convertir la requête générée à une requête supprimée mais qui change le nombre de lignes qu'il trouve. Je modifierais le SQL à la main mais c'est un peu au-delà de moi et que 7 lignes de long.

Est-ce que quelqu'un sait un bon moyen de se débarrasser des duplicats?


0 commentaires

5 Réponses :


1
votes

Utilisez une sélection avec toutes les colonnes, à l'exception de la colonne ID:

SELECT DISTINCTROW Column1, Column2, Column3 
INTO MYNEWTABLE
FROM TABLE


1 commentaires

Peut-être que je fais quelque chose de mal, mais cela fait dupliquer toute la table.



7
votes

La raison pour laquelle la requête de recherche de Duplicats ne vous permettra pas de supprimer les enregistrements est dû au fait qu'il s'agit essentiellement d'une requête agrégée, elle comptage le nombre de doublons qu'elle trouve et renvoie les cas où le nombre est supérieur à 1.

Considérez que si vous avez effectué une requête de suppression basée sur les doublons trouvées, elle supprimerait toutes les lignes qui ont des valeurs en double, ce qui n'est peut-être pas ce que vous voulez. Vous voulez supprimer tout sauf l'un des doublons.

Vous devez essayer de supprimer tous les doublons d'un enregistrement en dehors d'une, à l'exclusion de la colonne ID de votre comparaison. Je suggère que le moyen le plus simple de faire est de faire une requête de make-table de tous les unique valeurs (sélectionnez le champ distinct1, le champ2 ... de MyTable) à la place pour chaque champ sauf pour le champ ID, en utilisant les résultats dans A pour créer un nouveau tableau d'environ 2000 enregistrements (si la moitié sont des duplicats).

Ensuite, créez une colonne d'identité sur votre nouvelle table, utilisez une requête de mise à jour pour mettre à jour cet ID sur le premier identifiant correspondant dans la table d'origine (vous pouvez le faire en utilisant dlookup , qui retournera la première valeur d'expression où les critères sont tristes dans le domaine ).

la fonction dlookup () renvoie un valeur d'un seul champ, même si plus qu'un enregistrement satisfait à la Critères. Si aucun disque satisfait le critères, ou si le domaine ne contient pas Enregistrements, Dlookup () renvoie un null.

Étant donné que vous identifiez le premier identifiant correspondant en fonction de tous les autres champs, qui sont des valeurs uniques, les identifiants inégalés appartiendront à des doublons. Vous allez annuler la relation PK, identifiant la première touche correspondante donnée à un ensemble de champs uniques. Après cela, vous devez définir l'ID pour être pk. Bien sûr, cela suppose que l'identifiant n'a aucune signification inhérente, et vous ne vous souciez pas de garder une carte d'identité particulière pour une ligne dupliquée donnée sur l'un des identifiants appartenant aux autres lignes dupliquées. Cela suppose que vous vous souciez des données de la colonne ID afin que vous souhaitiez la préserver pour toutes les lignes restantes, sinon ignorez l'étape DlookUp et sélectionnez Sélectionner des informations distinctes sur toutes les colonnes à partir de l'ID.


4 commentaires

Aha! Ces deux premiers paragraphes ont beaucoup de sens! J'ai fait une requête comme suit: Sélectionnez Blah1 distinct, Blah2, Blah3, etc., dans une nouvelle carte d'Allrecords ... qui m'a donné 2144 records, qui semble à peu près bien. Cela n'a pas seulement créé une copie de la table sans les duplicats? C'est à dire. Dois-je réellement besoin du bit Dlookup?


Oui, il a copié toutes les lignes. Vous n'avez pas besoin de faire le bit Dlookup à moins que vous n'ayez besoin de garder les identifiants pour toutes les lignes.


Lorsque @dale Halliwell dit "La raison pour laquelle la recherche de la recherche de Duplicats ne vous permettra pas de supprimer les enregistrements est parce qu'il s'agit essentiellement d'une requête agrégée" il fait une fausse déclaration. L'assistant de Trouver Duplicats utilise une requête agrégée dans une sous-requête de la clause WHERE, mais la requête de base doit être modifiable, à condition que vous ayez choisi de Dupe, vous avez été modifiable pour commencer.


@David W Fenton, FYI @dale Halliwell est correct, je ne peux pas supprimer directement avec la requête Find-Duplicats, mais je peux supprimer de la table de base. J'ai récemment le même problème que l'op, mais avec des tables beaucoup plus grandes, je ne pouvais pas le résoudre avant aujourd'hui. Cette méthode fonctionne pour moi donc +1



1
votes

Les éléments suivants conservent les identifiants d'origine et le faire en une étape: xxx

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


2 commentaires

Je ne pense pas que cela fonctionnerait. Chaque enregistrement a un identifiant distinct, c'est-à-dire que les doublons sont identiques à tous points de vue sauf pour la colonne ID. S'il y avait une colonne d'identification unique, je serais terminé maintenant!


Dans votre question, vous mentionnez que l'identifiant est automatique que je prends pour signifier automatiquement incrémenté, de sorte que cette requête reviendra des enregistrements groupés en double et des identifiants de comptage. Cela fonctionnerait en effet. Essayez!



1
votes
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
    )

0 commentaires

0
votes

En fait, j'ai trouvé une solution très simple prenant un certain temps, mais tous vos champs sont identiques comme un enregistrement en double complet, il suffit de faire une requête avec chaque domaine et trier par "groupe par". Ainsi, les duplicats se combineront et vous pouvez simplement ajouter ces informations à une nouvelle table et le 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 il combinerait toujours les données (en supposant que vous ne vous souciez pas des données dans le champ principal). Je ne sais pas pourquoi personne n'a mentionné cette solution m'a pris 5 heures. venir avec. :)


0 commentaires