cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018 2 sept. 2006 à 09:50
Maintenant pour répondre exactement à ta question, effectivement ma solution SQL ne fonctionne pas lorsque qu'il y a une clé unique à plusieurs champs : elle donne tous les enregistrements dont au moins un champ est impliqué dans des doublons, ce qui n'est certes pas la même chose. Heureusement, j'ai testé ta solution, et cela fonctionne parfaitement cette fois (la requête est toujours éditable), et la syntaxe est plus simple. Je ne savais pas que Exists était possible en SQL Access, Bravo en tout cas.
cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018 1 sept. 2006 à 13:01
Oops ! j'ai confondu avec mon autre source du même type :
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)
otineb
Messages postés2Date d'inscriptionvendredi 1 septembre 2006StatutMembreDernière intervention 1 septembre 2006 1 sept. 2006 à 12:32
Oui ça marche mais c'est une manipulation Access ce qui est différent d'une solution purement SQL ... Et puis tu ne fais pas le choix proprement dit des records que tu gardes ...
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 !
cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018 1 sept. 2006 à 11:38
> Prenons un exemple avec une table TABLE comportant 3 champs A,B et C que l'on veut passer en clef.
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
otineb
Messages postés2Date d'inscriptionvendredi 1 septembre 2006StatutMembreDernière intervention 1 septembre 2006 1 sept. 2006 à 10:50
Hmmm...
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 ...
cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018 9 mai 2006 à 10:23
Pour info, les requêtes avec un joint sont souvent en lecture seule également : cette technique fonctionne aussi dans ce cas : par exemple vous avez une table listant des articles à supprimer, et vous devez supprimer le stock de ces articles : il suffit d'ajouter à votre requête la clause WHERE Stock.CodeArticle IN (SELECT ArticlesASupprimer.CodeArticle FROM ArticlesASupprimer)
cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018 7 nov. 2005 à 13:29
Note : il faut que ImportPersonne.Nom ne soit pas Null pour que cela fonctionne, car sinon ils seront aussi comptabilisés logiquement dans les doublons (on ne peut apparemment pas combiner la clause avec un And ImportPersonne.Nom Is Not Null).
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 ...
9 mai 2006 à 10:23
7 nov. 2005 à 13:29