Version complète: sur le forum Webmaster Hub : Recherche requète de supression de doublons
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > SQL
MarvinLeRouge
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 :
CODE
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
Kioob
Hello,

CODE
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é ?

MarvinLeRouge
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 smile.gif
Kioob
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 tongue.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.