comment supprimer des doublons ? [SQL] - Programmation
Marsh Posté le 05-10-2001 à 15:12:00
personne ne sait ?
je precise qu'il s'agit de SQL server
merci de me répondre
Marsh Posté le 05-10-2001 à 16:07:04
méthode bourrin:
select distinct (champs avec doublons) from table_qui_va_pas
le tout dans une table temporaire, puis suppression de l'ancienne table et renommage de la table temporaire
méthode qu'elle est déjà un peu mieux puisque pas de table temporaire
delete from table_qui_va_pas where champ_double in
(select count(champ_double) from table_qui_va_pas having count(champ_double) >= 2)
pas sur que ca marche sur SQL-Server
Marsh Posté le 05-10-2001 à 16:10:15
jupiler ta deuxieme methode ne va pas, je pense, laisser un exemplaire du doublon ??????
Marsh Posté le 05-10-2001 à 16:32:42
BenDk97 a écrit a écrit : jupiler ta deuxieme methode ne va pas, je pense, laisser un exemplaire du doublon ?????? |
ben c'est ce que tu veux non? supprimer les doublons
bon alors tu fais une table temporaire qui contient les id des doublons (select ... having count >=2)
puis tu delete les lignes de doublons :
delete from table_qui_va_pas where id in (select id from la_table_temporaire)
(fais une jointure plutot qu'un select in, c'est plus propre)
il ne te reste plus qu'à réinjecter le contenu de la table temporaire dans la table de départ puisque la table temporaire ne contient qu'un seul exemplaire de chaque doublon
[edtdd]--Message édité par jupiler--[/edtdd]
Marsh Posté le 05-10-2001 à 18:31:48
delete * from table where id not in (select distinct id from table)
La requete imbriqué selectionne 1 exemplaire de chaque (donc ignore les doublons)
Ensuite la 1er requete supprime tout les entrées dont les resultats ne sont pas ds la requete imbriqué, donc les doublons.
Ca marche ?
Marsh Posté le 06-10-2001 à 09:16:40
Autre méthode plus simple :
tu fais un group by comme on t'a dit
Hirondelle 20
Tortue 6
Elephant 3
Et là tu lances une boucle qui selectionne le doublon que tu veux garder par ex le plus récent en id
SELECT TOP 1 id FROM base WHERE nom = 'hirondelle' ORDER BY id desc
Là tu récupères une seule ID : l'ID à pas effacer
Et tu effaces le reste :
DELETE FROM base WHERE nom = 'hirondelle' AND id <> id_a_pas_effacer
Marsh Posté le 06-10-2001 à 13:52:08
Euh, c a peut de chose pret la meme chose, sauf ke moi c ecrit en language ki doit fonctionner
Marsh Posté le 25-01-2005 à 19:47:31
salut
j'ai regardé ce que vous donnier comme code mais ca ne marche pas ou alors j'ai mal fais
enfin c'est pas le pb, et j'ai donc fouinné pour trouver une autre solution.
le coup de la table temporaire me plaisait bien, j'ai donc fait une requete:
INSERT INTO imprimantesTMP (modele, marque, nogroupe, nogroupe2)
SELECT DISTINCT(modele) FROM imprimantes;
et malheuresemnt ca ne marche pas... je capte pas
si quelqu'un voit une erreur ...
Marsh Posté le 05-10-2001 à 14:53:14
et conserver uniquement un exemplaire
j'ai une base daubée à nettoyer