cs_Ry_Yo
Messages postés9Date d'inscriptionjeudi 6 avril 2006StatutMembreDernière intervention 3 mai 2006
-
6 avril 2006 à 14:09
rvblog
Messages postés792Date d'inscriptionvendredi 4 mars 2005StatutMembreDernière intervention12 juin 2012
-
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....
Mindiell
Messages postés558Date d'inscriptionjeudi 25 juillet 2002StatutMembreDernière intervention 5 septembre 20071 6 avril 2006 à 19:07
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)
Mindiell
Messages postés558Date d'inscriptionjeudi 25 juillet 2002StatutMembreDernière intervention 5 septembre 20071 6 avril 2006 à 14:32
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...
cs_Ry_Yo
Messages postés9Date d'inscriptionjeudi 6 avril 2006StatutMembreDernière intervention 3 mai 20061 6 avril 2006 à 14:50
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......
cs_Ry_Yo
Messages postés9Date d'inscriptionjeudi 6 avril 2006StatutMembreDernière intervention 3 mai 20061 6 avril 2006 à 17:41
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 ?
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>
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>
cs_Ry_Yo
Messages postés9Date d'inscriptionjeudi 6 avril 2006StatutMembreDernière intervention 3 mai 20061 6 avril 2006 à 22:40
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.....
Mindiell
Messages postés558Date d'inscriptionjeudi 25 juillet 2002StatutMembreDernière intervention 5 septembre 20071 7 avril 2006 à 03:55
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)
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>