Imaginez que vous vouliez importer des enregistrements depuis une table d'import. Vous voudriez pouvoir détecter les doublons avant l'import effectif. Pour cela, le plus pratique est d'afficher une requête qui présente tous les doublons de la table d'import, et si la requête est éditable, alors l'utilisateur pourra choisir parmi les doublons les enregistrements à supprimer et ceux à conserver afin d'éliminer les doublons. Or pour qu'une requête de doublon soit éditable, il faut chercher un peu, car en général, les regroupements donnent des requêtes en lecture seule. Cependant, en imbriquant les requêtes avec la clause IN, il est tout à fait possible de faire une requête éditable (sous Access en tout cas) :
Source / Exemple :
SELECT * FROM ImportPersonne
WHERE ImportPersonne.Nom IN
(SELECT ImportPersonne.Nom FROM ImportPersonne GROUP BY ImportPersonne.Nom HAVING Count(*)>1)
ORDER BY ImportPersonne.Nom;
Et si la clé unique de votre table est basée sur plusieurs champs, vous pouvez même enchaîner les clauses IN :
SELECT * FROM ImportPersonne
WHERE ImportPersonne.Nom IN
(SELECT ImportPersonne.Nom FROM ImportPersonne GROUP BY ImportPersonne.Nom, ImportPersonne.Prenom HAVING Count(*)>1)
AND ImportPersonne.Prenom IN
(SELECT ImportPersonne.Prenom FROM ImportPersonne GROUP BY ImportPersonne.Nom, ImportPersonne.Prenom HAVING Count(*)>1)
ORDER BY ImportPersonne.Nom, ImportPersonne.Prenom;
Conclusion :
Note : Il est possible de tester à part les requêtes de regroupement avant de les inclure dans une clause IN.
Source : Access 97 Developers's Handbook
2 sept. 2006 à 09:50
1 sept. 2006 à 13:01
DÉDOUBLONNER FACILEMENT UNE TABLE MS ACCESS ET VOIR LA LISTE DES DOUBLONS
www.vbfrance.com/code.aspx?ID=16634
Tu as raison, cette manip ne permet pas de choisir les enregistrements (sauf en partie en les triant au préalable)
1 sept. 2006 à 12:32
Imaginons la même table avec un champ de plus (D) qui n'est pas dans la clef. Soit :
A1 B1 C1 Valeur1
A1 B1 C1 Valeur2
en faisant ta manip, ma table recoit A1 B1 C1 Valeur1 et la table des erreurs recoit quant a elle
A1 B1 C1 Valeur2 ... j'aurai bien aimé choisir quel était le record a gardé ...
cette table des erreurs c'est bien pratique mais attention elle est réécrite à chaque manipulation !
1 sept. 2006 à 11:38
Dans la copie de la table (sans données), tu indiques donc que la clé primaire est A+B+C ; ensuite tu fait un copié/collé des données et Access t'indique qu'il y a eu des erreurs de doublon, et qu'il a placé les erreurs dans la table des erreurs, laquelle contient donc au final :
A1 B1 C1
A2 B2 C2
Tandis que la table dédoublonnée avec la clé contient :
A1 B1 C1
A2 B2 C2
A1 B1 C2
Ya donc pas de "Hmmm..." ici, non ?
En fait l'exemple serait plus clair avec un identifiant pour chaque enregistrement :
1 A1 B1 C1
2 A1 B1 C1
3 A2 B2 C2
4 A2 B2 C2
5 A1 B1 C2
Erreurs :
2 A1 B1 C1
4 A2 B2 C2
Dédoublonnage :
1 A1 B1 C1
3 A2 B2 C2
5 A1 B1 C2
1 sept. 2006 à 10:50
Prenons un exemple avec une table TABLE comportant 3 champs A,B et C que l'on veut passer en clef.
Prenons comme records :
A1 B1 C1
A1 B1 C1
A2 B2 C2
A2 B2 C2
A1 B1 C2
Nous avons donc deux doublons (A1B1C1 et A2B2C2).
Avec le code ci dessus on récupère :
A1 B1 C1
A1 B1 C1
A2 B2 C2
A2 B2 C2
A1 B1 C2
on a bien les deux doublons mais on a aussi le record qui n'est pas doublonné !!!
Je propose donc plutot quelque chose du genre :
SELECT * FROM TABLE AS T1
WHERE Exists (Select t2.A,t2.B,t2.C from TABLE as T2 where t1.A=t2.A and t1.B=t2.B and t1.C=t2.C group by t2.A,t2.B,t2.C having count(*)>1);
si on veut les records non doublonnés, on change EXISTS par NOT EXISTS ...
seul pb : le cout de la requete qui est très conséquent !
Il y a surement une meilleure solution ...
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.