MarvinLeRouge Posté 7 Avril 2008 Posté 7 Avril 2008 (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, col3having 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é 8 Avril 2008 par Dan
Kioob Posté 7 Avril 2008 Posté 7 Avril 2008 Hello, delete from tableAwhere 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é ?
MarvinLeRouge Posté 8 Avril 2008 Auteur Posté 8 Avril 2008 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" 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
Kioob Posté 9 Avril 2008 Posté 9 Avril 2008 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
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant