Suppression de doublon.... [Résolu]

cs_Ry_Yo 9 Messages postés jeudi 6 avril 2006Date d'inscription 3 mai 2006 Dernière intervention - 6 avril 2006 à 14:09 - Dernière réponse : rvblog 794 Messages postés vendredi 4 mars 2005Date d'inscription 12 juin 2012 Dernière intervention
- 7 avril 2006 à 22:11
Bonjour à tous,

Je travail sous sqlserver et après recherche sur votre site, je n'ai pas trouvé de méthode pour supprimer des doublon ou triplon, quadruplon...d'une base...
prenons par exemple ma table "toto" qui possède un champ unique...

champ
-------
1
1
1
1
2
2
3
4
4
4
5
Donc la seule façon que j'ai trouvé c'est de faire un distinct dans une table temporaire, dropper la table principale et la recréer avec les enregistrements de la table temporaire...
Bon cette solution est pas trop viable quand c'est une table en production....

Merci de votre aide....
Afficher la suite 

11 réponses

Répondre au sujet
Mindiell 559 Messages postés jeudi 25 juillet 2002Date d'inscription 5 septembre 2007 Dernière intervention - 6 avril 2006 à 19:07
+3
Utile
Sur SQLServer, EntrepriseManager :
- Modifier Table
- Ajoute un champ nommé "idid" ou autre :o)
- Mets le en entier (int)
- Mets le en compteur (la fenetre du dessous)
- Appuye sur "Sauver"
- Va boire 12 cafés et dormir... 13 millions de ligne sont en cours de modifs ;o)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Mindiell
Mindiell 559 Messages postés jeudi 25 juillet 2002Date d'inscription 5 septembre 2007 Dernière intervention - 6 avril 2006 à 14:32
0
Utile
As-tu un champ permettant de différencier les lignes entre elles ?
par exemple :
1 prenom1
1 prenom2
1 prenom3

Sinon, si deux lignes sont exactement egales, alors désolé, mais c'est impossible de le faire directement. Il faut inserer une nouvelle colonne unique...

Tiens nous au courant :o)
Commenter la réponse de Mindiell
cs_Ry_Yo 9 Messages postés jeudi 6 avril 2006Date d'inscription 3 mai 2006 Dernière intervention - 6 avril 2006 à 14:50
0
Utile
Hélas si j'avais un identifiant unique ça serait plus simple....

Mais ceux sont vraiment des lignes identiques.... En fait la table a été crée sans id.... ce qui fait que certain user sont des frénésiques du clic et intègre en plusieurs exemplaires les données...

Voilà donc mon problème..... Depuis j'ai mis en place un contrôle avant insertion dans la table par programmation... mais pour les enregistrements déjà passé.... il faudrait que je delete les lignes en x exemplaires......
Commenter la réponse de cs_Ry_Yo
Mindiell 559 Messages postés jeudi 25 juillet 2002Date d'inscription 5 septembre 2007 Dernière intervention - 6 avril 2006 à 15:04
0
Utile
Comme expliqué ci-dessus :

insère une nouvelle colonne strictement unique afin de nettoyer ta table, puis tu pourras la supprimer...
Commenter la réponse de Mindiell
cs_Ry_Yo 9 Messages postés jeudi 6 avril 2006Date d'inscription 3 mai 2006 Dernière intervention - 6 avril 2006 à 17:41
0
Utile
Pour rajouter une colonne ok
Mais pour créer un numéro unique ça je ne sais pas faire.....(dsl)
ma table comporte 7 millions de lignes... je me vois mal le faire manuellement...
Je suppose qu'en faisant une procedure stockée ou autre on peut ajouter un numéro unique en automatique ?
Commenter la réponse de cs_Ry_Yo
rvblog 794 Messages postés vendredi 4 mars 2005Date d'inscription 12 juin 2012 Dernière intervention - 6 avril 2006 à 19:13
0
Utile
Salut 740724 Ry_Yo, salut à tous les autres,

Solution hypothétique (plus propre que le DROP), fais un script :

Sauvegardes ta table avant (garantie AS IS), lis le script, et fais-toi ton avis avant de l'exécuter (je ne voudrais pas être responsable de la fin de ton CPE :) )

1./ un SELECT PseudoPK, Count(*)
INTO TempTablePK
FROM TableMoche
GROUP BY PseudoPK
HAVING count(*) > 1

remplirait une table temporaire avec les clés correpondant aux doublons, triplons...

2./ un SELECT DISTINCT TableMoche.*
INTO TempTablePKDoublons
FROM TableMoche, TempTablePK
WHERE TableMoche.PseudoPK = TempTablePK.PseudoPK

remplirait une table temporaire avec les lignes uniques liées à des doublons,...

3./ un SELECT PseudoPK, count(*)
FROM TempTablePKDoublons
GROUP BY PseudoPK

vérifierait que chaque ligne est bien unique, en retournant 1 comme compte pour chaque ligne (j'espère pour toi qu'il n'y a pas 3,5 millions de lignes uniques)

4./ un DELETE TableMoche
FROM TableMoche, TempTablePK
WHERE TableMoche.PseudoPK = TempTablePK.PseudoPK

effacerait de la table moche juste les lignes possédant les PseudoPK incriminés.

5./ un INSERT TableMoche
SELECT * FROM TempTablePKDoublons

ré-insèrerait les lignes uniques dont le PseudoPK était incriminé.

à+

rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais
</SUP>
Commenter la réponse de rvblog
Mindiell 559 Messages postés jeudi 25 juillet 2002Date d'inscription 5 septembre 2007 Dernière intervention - 6 avril 2006 à 19:54
0
Utile
Un truc important :

SELECT PseudoPK, count(*)
FROM TempTablePKDoublons
GROUP BY PseudoPK
HAVING count(*)>1

Ca permet de sortir les doublons, et uniquement eux ! ;o)

Deuxièmement, ma solution permet de supprimer les doublons sans jamais en effacer trop dans la table...

A toi de voir !
Commenter la réponse de Mindiell
rvblog 794 Messages postés vendredi 4 mars 2005Date d'inscription 12 juin 2012 Dernière intervention - 6 avril 2006 à 22:24
0
Utile
Salut 12892 Mindiell,

tu as déjà bien raison de relire, c'est important.
En effet, pour le point 3, la vérification est plus courte ainsi!

Ta solution est celle que j'aurais choisie d'instinct si j'avais le problème, mais ni je n'ai le problème, ni le pouvoir de faire le choix de la solution :)

Ceci dit, pour quand même essayer de vendre ma solution :) je n'aurais , même dans le pire des cas (par ex: 1 seul doublon = 6 999 999 modifs), à modifier 7 millions d'enregistrements, parmi 7 millions d'enregistrements dans une table!

du coup, Ry_Yo aura moins de caféïne dans le sang avant d'aller se coucher !)

PS : quoi qu'il en soit, on est tous d'accord, une table sans PK, c'est pas une table, c'est une feuille de calcul, et une feuille de calcul avec une seule colonne, c'est pas une feuille de calcul, c'est une punition, et une punition de 7 000 000 de lignes, t'as du faire une sacrée bêtise :)
à+

rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais
</SUP>
Commenter la réponse de rvblog
cs_Ry_Yo 9 Messages postés jeudi 6 avril 2006Date d'inscription 3 mai 2006 Dernière intervention - 6 avril 2006 à 22:40
0
Utile
Merci de votre aide je vais mettre ça en place dès demain.... Ni vu ni connu j'atoute la colonne, je delete les doublons, triplons et autres et j'alter de nouveau ma table en virant l'id... comme ça on m'accusera pas d'avoir touché la structure d'une table en cas de soucis (hypothétique) par la suite.....
Commenter la réponse de cs_Ry_Yo
Mindiell 559 Messages postés jeudi 25 juillet 2002Date d'inscription 5 septembre 2007 Dernière intervention - 7 avril 2006 à 03:55
0
Utile
Euh, rvblog, les lignes à modifier c'est super rapide quand même hein, oublie pas que toi, tu vas copier quelques centaines de milliers de lignes dans un sens puis dans l'autre, etc... C'est beaucoup moins gourmand ma solution, l'ajout de la colonne n'en est qu'une partie ;o)
Commenter la réponse de Mindiell
rvblog 794 Messages postés vendredi 4 mars 2005Date d'inscription 12 juin 2012 Dernière intervention - 7 avril 2006 à 22:11
0
Utile
Salut , salut 12892 Mindiell,

décidément, je n'ai pas la chance avec moi! C'est pas grave, je suis là pour apprendre.
Dis-moi =12892 Mindiell, justement, l'ajout de colonne n'en est qu'une partie, et quelle est l'autre partie ?

à+

rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais
</SUP>
Commenter la réponse de rvblog

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.