Aller au contenu

Recherche requète de supression de doublons


Sujets conseillés

Posté (modifié)

Salut,

Bon, j'ai une table tableA (idTableA, col1, col2, col3, col4, col5). La véritable clé de la table est constituée des colonnes 1, 2 et 3. Mais j'ai eu un problème à l'import des données et j'ai quelques doublons (en fait, quelques centaines, mais c'est peu par rapport au volume. J'ai trouvé comment déterminer quels éléments avaient des doublons, grâce à la requète suivante :

select col1, col2, col3, count(idTableA)
from tableA
group by col1, col2, col3
having count(idTableA) > 1

Sachant que je n'ai au maximum qu'un seul doublon par ligne concernée, quelqu'un aurait-il une idée de la forme de la requète à utiliser pour supprimer un des doublons (toujours celui avec le plus petit idTableA, par exemple) ?

Merci

Modifié par Dan
Posté

Hello,

delete from tableA
where idTableA = (
select min(idTableA)
from tableA
group by col1, col2, col3
having count(idTableA) > 1
)

Maintenant ce qui me fait peur c'est pourquoi avoir un "id" numérique si la "clé logique" de la table correspond à 3 autres champs ?

Ca peut être justifié hein, mais dans ce cas pourquoi ne pas avoir mis une contrainte d'unicité ?

Posté

Salut,

Alors :

a) sauf erreur de ma part, ta requète ne supprimerait qu'un seul des doublons, celui avec le plus petit id de tous. Or, il peut y avoir plusieurs doublons, mais un seul max par ligne "bonne"

B) pour les raisons qui ont poussé à ça, il y a une raison de temps limité et d'importance de l'enjeu au moment de la conception : il ne s'agit pas ici d'un problème professionnel, mais d'une bdd créée "à l'arrache" pour des besoins persos, et comme je ne savais pas créer une contrainte d'unicité basée sur plusieurs colonnes, j'ai fait comme ça

c) sinon, j'ai trouvé un moyen : je fais un select distinct, avec lequel je crée une nouvelle table, je droppe la première et je renomme la seconde et zou c'est réglé

Merci :)

Posté

Pour le point "a", le plus simple est peut-être de lancer la requête autant de fois que nécessaire, non ? Tant que des enregistrements sont supprimés, boucler sur la requête. Sinon passe par une table temporaire, dans laquelle tu gardes col1,col2,col3,max(id) ; et tu fais un delete si les 3 premiers champs sont bons et le quatrième diffère.

Pour le point "c", fallait le dire tout de suite que tu te fichais des données tel que l'id :P

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...