Suppression de doublons

Soyez le premier à donner votre avis sur cette source.

Snippet vu 23 801 fois - Téléchargée 15 fois

Contenu du snippet

C'est une suite de requêtes qui permettent de supprimer les doublons d'une table. Il y en a d'autre sur le site, mais j'ai pas réussi à m'en servir, alors j'ai fait la mienne.

Je l'ai testé sur un table de 12000 enregistrements, et elle s'est exécuté en quelques centièmes de secondes.

Remplacer:
- "MaTable" par le nom de la table qui contient des doublons
- "ChampsAvecDoublons" par le nom du champs qui contient des doublons

Source / Exemple :


CREATE TEMPORARY TABLE MaTable_temp SELECT id FROM MaTable GROUP BY ChampsAvecDoublons;

ALTER TABLE MaTable_temp ADD UNIQUE (id);

DELETE FROM MaTable WHERE id NOT IN (SELECT id FROM MaTable_temp);

DROP TEMPORARY TABLE MaTable_temp;

OPTIMIZE TABLE MaTable;

Conclusion :


Je ne suis pas très expérimenté en SQL, donc j'ai fait avec les moyens du bord, mais ca marche impec et très rapidement. Si vous avez de meilleurs idées, je serais heureux d'apprendre!

A voir également

Ajouter un commentaire

Commentaires

Messages postés
56
Date d'inscription
mercredi 29 septembre 2004
Statut
Membre
Dernière intervention
4 janvier 2010
1
Tu peux aussi utiliser la tâche "Regroupement probable" dans SSIS.

http://www.xoowiki.com
Messages postés
286
Date d'inscription
vendredi 5 décembre 2003
Statut
Membre
Dernière intervention
22 avril 2012
1
Hello !

Attention qu'un distinct est coûteux en temps: il faut effectuer un sort unique... S'il y a un order by dans la query, on trie une seconde fois.
De plus, s'il y a des doublons, c'est qu'il y a un problème au niveau du datamodel...
Messages postés
6
Date d'inscription
vendredi 19 août 2005
Statut
Membre
Dernière intervention
10 juin 2011

En quoi est-ce plus compliqué ?

Si vous voulez gérer le distinct sur "", remplacer le par n'importe quelle valeur bidon :
SELECT DISTINCT DECODE(colonne_a_traiter, '', '@@@@', colonne_a_traiter)
FROM table_a_traiter;

Si vous voulez gérer le distinct sur la valeur NULL, remplacer la par n'importe quelle valeur bidon :
SELECT DISTINCT NVL(colonne_a_traiter, '@@@@')
FROM table_a_traiter;

En espérant vous avoir été utile.
Messages postés
1
Date d'inscription
jeudi 26 juillet 2007
Statut
Membre
Dernière intervention
29 mars 2009

oui julien39,

c facile avec "distinct" pour "select distinct champ from table"

mais pour : ""
SELECT Distinct Formation.N_CIN, Personnel.DOTI, Personnel.nom_prenom, Personnel.Service, Formation.Lieu_Formation FROM Formation INNER JOIN Personnel ON Formation.N_CIN=Personnel.cin;
"

ca devient compliqué
Messages postés
286
Date d'inscription
vendredi 5 décembre 2003
Statut
Membre
Dernière intervention
22 avril 2012
1
Je ne sais pas si ça fonctionne avec d'autres SGBD's, mais avec Oracle, il suffit de faire:

DELETE FROM
MaTable A
WHERE
A.rowid >
ANY (SELECT B.rowid
FROM
MaTable B
WHERE
(A.col1 = B.col1 OR (A.col1 is null AND B.col1 is null))
AND
(A.col2 = B.col2 OR (A.col2 is null AND B.col2 is null))
)
;

Ou encore:

delete from
MaTable
where rowid in
(select rowid from
(select
rowid,
row_number()
over
(partition by col1 order by col1) dup
from MaTable)
where dup > 1);
Afficher les 8 commentaires

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.