begin process at 2010 03 20 01:27:40
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Trucs & Astuces

 > ACCESS SQL : REQUÊTE ÉDITABLE POUR LA RECHERCHE DE DOUBLONS

ACCESS SQL : REQUÊTE ÉDITABLE POUR LA RECHERCHE DE DOUBLONS


 Information sur la source

Note :
6,25 / 10 - par 4 personnes
6,25 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Trucs & Astuces Classé sous :access, requête, doublon Niveau :Débutant Date de création :03/05/2005 Vu :16 581

Auteur : Patrice99

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note


 Description

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

  • 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;
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


 Sources du même auteur

FORCER UNE MISE À JOUR AVEC UNE REQUÊTE DE REGROUPEMENT POUR...

 Sources de la même categorie

COMMENT EXPORTER DES DONNERS VERS EXCEL par ig3
COMMENT EXPORTER DES DONNERS VERS EXCEL par ig3
Source avec Zip Source avec une capture SQL SERVER - GENERATION AUTOMATIQUE D'UNE RETRO-DOCUMENTATIO... par FENETRES
[SQL SERVEUR] VÉRIFIER L'ESPACE OCCUPÉ DANS UNE BASE DE DONN... par Hyperion
TROUVER LES PROCHAINS ANNIVERSAIRES par zefo

 Sources en rapport avec celle ci

REQUETE SUPPRESSION DE DOUBLON SOUS ORACLE par lamjed
REQUETE SUPPRESSION DE DOUBLON par tba
[ACCESS] UTILISER UN PIVOT par Zlub
INSERTION DE DONNÉES par NetJoao
REQUÊTE DE DOUBLON par dahbia

Commentaires et avis

Commentaire de Patrice99 le 07/11/2005 13:29:31

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

Commentaire de Patrice99 le 09/05/2006 10:23:48

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)

Commentaire de otineb le 01/09/2006 10:50:54

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



Commentaire de Patrice99 le 01/09/2006 11:38:50

> 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

Commentaire de otineb le 01/09/2006 12:32:45

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 !

Commentaire de Patrice99 le 01/09/2006 13:01:58

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)

Commentaire de Patrice99 le 02/09/2006 09:50:15

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.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

vba sous access - insertion d'une requete dans une table [ par bonnaud ] Bonjour, J'ai fait une requête sous access en vba qui me permet de calculer un nouveau champ que j'ai nommé total à partir d'une table. Requête paramètrée dans ACCESS [ par NeoCeltiK ] Bonjour.Je travaille sur une petite base de données Access.J'ai crée une requète "Analyse croisée dynamique" paramètrée, nommée ANALYSE_DEFAUTS.Les pa Problème de requête SQL sous Access [ par Dark Revan ] Voilà, je dois trouver les équipes qui ont terminé des match en fusillade depuis une certaine date et je dois donner les équipes e Problème requête SQL (Access) [ par klimium ] Bonsoir, J'ai un petit problème avec ma requête SQL. Access me dit que ma fonction DAYOFMONTH n'est pas définié .. SELECT id, e_s, DAYOFMONTH(dateRe problème de doublon [ par redmoon357 ] bonjour,je doit faire une requête qui ressort certain numéro, mais tout en supprimant les doublons. j'ai trouver de nombreuse réponse à ma question, m Requete avec résultat diférent selon Access ou Excel [ par gorby69 ] Salut à tous,Je suis en train de péter un câble contre Microsoft...Je vous explique: je travaille en VBA sous Excel XP et j'attaque une Requête dans Visual Studio 2008 à partir d'une BDD Access 2007 [ par LordKelvin ] Bonjour, J'ai connecté, dans Visual Studio 2008, une BDD Access 2007, et déjà première chose qui me chiffonne : les requêtes créées sous Access appar [Access 2007] - requête avec auto-incrément [ par ben85000 ] Bonjour à tous ! J'ai un petit problème avec une requête SQL avec une clé primaire qui est en auto-incrément. Voici la requête en question qui cloche Requête LIKE Access [ par ansizak ] Bonjour à tous.. Je reste dans l'incompréhension totale devant cette requête qui ne fonctionne pas: SELECT * from channel WHERE channelname LIKE 'TV Datepart [ par lilia04 ] bonjour, je vous explique mon problème, je souhaite que ma requête calcule une moyenne journalière. dans ma table j'ai une moyenne à chaque instant T


Nos sponsors


Sondage...

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,608 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales