[SQL] Suppression de doublons

Suppression de doublons [SQL] - Programmation

Marsh Posté le 26-07-2002 à 12:18:57    

N'étant pas très expérimenté (ni doué :??: ) je bricole
 
Donc je peux y arriver mais je trouve que ma méthode est un peu lourde (je recherche les doublons; je mets leur indice en négatif; pour chaque série de doublons je recherche l'indice min et le remets en positif; finalement je supprime toutes les entrées dont l'indice est négatif).
 
N'y aurait-il pas plus simple et léger?

Reply

Marsh Posté le 26-07-2002 à 12:18:57   

Reply

Marsh Posté le 26-07-2002 à 12:39:12    

C'est quoi la structure de ta table ?
 
Y'a un champ ID ?
 
Cà doublonne sur quoi ?
 
C'est quelle base SQL ?


Message édité par Mara's dad le 26-07-2002 à 12:39:35

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 26-07-2002 à 12:52:53    

Je bosse sous Access mais je travaille sur deux table liées par un indice: une table Access (d'appels) et une table (de références clients) qui est un lien vers une db5.
 
Dans les tables existe une floppée de champs; mais les doublons que je recherche sous 100% identiques à l'exception de l'indice qui est incrémenté à chaque ajout (en fait un logiciel extérieur peut créer dans ces tables des entrées identiques à plusieurs reprises et moi je passe derrière pour nettoyer)
 
J'espère que ma présentation est assez claire.
 
Et merci pour l'aide :)


Message édité par PatBasi le 26-07-2002 à 12:55:20
Reply

Marsh Posté le 26-07-2002 à 13:06:16    

Pourrais-tu donner les structures des tables en indiquant les champs qui sont différents et les champs identiques dans le cas des doublons ?
 
J'ai du mal à comprendre : tes doublons sont dans qielle table ?
 
Tu utilises quelle type de base de données (Access, MySQL, Oracle, ...) ?


Message édité par irulan le 26-07-2002 à 13:06:29
Reply

Marsh Posté le 26-07-2002 à 13:22:48    

Hehe
 
Table appels: un champ indice; et les autres
Table client: un champ indice; et les autres
 
appels et clients sont liés par l'indice
 
Pour simplifier il faut considérer qu'il n'y a k'une grosse table.
 
Et je recherche les doublons sur tous les champs mis à part l'indice
 
 
Exemle:
************************************
Indice     Champ1     Champ2_....
1           bob          truc
2           blabla       cahuète
3           bob          truc
4           bob          MACHIN!!!!
************************************
Dans cet exemple comme les lignes 1 et 3 sont identiques sur tous les autres champs que l'indice, j'aimerais qu'il en supprime une des deux


Message édité par PatBasi le 26-07-2002 à 13:23:55
Reply

Marsh Posté le 26-07-2002 à 13:37:10    

Bon tu peux essayer un truc du genre :
 
SELECT champ1, champ2, COUNT(indice)
from MaTable
GROUP BY champ1,champ2
HAVING COUNT(indice) > 1;
 
Ce bout de code est valable pour une seule table, à toi de l'adapter pour deux tables.
Ca te permet de selectionner les lignes en doublon.


Message édité par irulan le 26-07-2002 à 13:38:15
Reply

Marsh Posté le 26-07-2002 à 13:40:07    

Pour effacer, il faudrait ne sélectionner que la première des lignes de chaque doublon (par exemple sous Oracle, utiliser ROWNUMBER < 2, mais bon comme tu n'as toujours pas précisé ton SGBD...)


Message édité par irulan le 26-07-2002 à 13:40:30
Reply

Marsh Posté le 26-07-2002 à 14:12:35    

Merci pour ton aide :)  
 
Et j'ai dit que j'étais sous Access (zè pas le choix =/ )
 
De plus quand je dis doublons cela peut monter à plus de deux (je peux très bien avoir 10 enregistrements identiques mais d'indice différent)
 
Mais ne t'emb^te pas trop la base n'est pas très grosse et si la méthode n'est très optimisé je survivrai à cela (c juste ke j'aime bien faire les choses correctement :sol: ).

Reply

Marsh Posté le 26-07-2002 à 14:53:48    

Autant pour moi, je n'avais pas capté que tu étais sous Access.
 
Enfin ça ne fait rien, le Select est valable sous Access je pense (c'est du SQL standard).
 
Sinon, le select avec le group by te renvoie en fait toutes les valeurs qui ont plus d'une occurrence (donc à partir de 2 et + )

Reply

Marsh Posté le 26-07-2002 à 17:51:57    

Select et group by, ya pa de problème
 
Or si je ne me trompe pas là tu ne m'exposes que la sélection des doublons (et de tous les enregistrements amors qu'il ke j'en garde 1)
 
En fait la sélection c ok (je savais faire, et même la suppression mais de manière assez lourde)
 
J'essayais juste de faire plus simple pour supprimer tous les enregistrements surnuméraires. Mais comme je te disais ne te prends pas trop la tête, il n'y a rien de vital (ce ki ne veut pas dire que je cherche à te décourager de m'aider; ton aide et le temps que tu me consacres sont fortement appréciés  :jap: -sans parler du zeste de patience vu comment je suis embêtant ;) -).

Reply

Marsh Posté le 26-07-2002 à 17:51:57   

Reply

Marsh Posté le 26-07-2002 à 23:45:34    

Attention, çà va faire mal !
 

Code :
  1. DELETE
  2. indice
  3. FROM
  4. appels
  5. WHERE
  6. indice Not In
  7.  ( SELECT first( A.indice )
  8.   FROM appels As A
  9.   GROUP BY c1,c2,c3
  10.   HAVING Count(*)>1  And A.c2 = appels.c2 And A.c3 = appels.c3
  11.  )
  12. AND c1 In
  13.  ( SELECT B.c1
  14.   FROM appels As B
  15.   GROUP BY c1,c2,c3
  16.   HAVING Count(*)>1  And B.c2 = appels.c2 And B.c3 = appels.c3
  17.  );


 
Le tout en une seule requête !
 
Le but est de garder celui de plus faible indice parmis les records qui ont des doublons.


Message édité par Mara's dad le 26-07-2002 à 23:46:23

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 27-07-2002 à 00:51:04    

J'aime quand on me fait mal comme çà :hap:  
 
Merci beaucoup :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed