IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Requête dédoublonnage SQL


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Requête dédoublonnage SQL
    Bonjour à tous,

    Après avoir fait le tour de tous les articles, tutoriels sur le sujet (notamment http://sqlpro.developpez.com/cours/doublons/) je n'est rien trouvé qui réponde à mon interrogation.

    Je dois effectuer une requête de dédoublonnage (trouver les doublons et les supprimer) sur une table dont le code est ci dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE `table` (
      `Id1` int(10) NOT NULL default '0',
      `Id2` varchar(5) NOT NULL default '',
      `Id3` varchar(5) NOT NULL default '',
      `AAA` varchar(5) NOT NULL default '',
      `PPP` varchar(7) NOT NULL default '',
      `NNN` varchar(10) NOT NULL default '',
      `OOO` varchar(10) NOT NULL default '',
      `CCC` varchar(10) NOT NULL default '',
      `TTT` varchar(5) default NULL
    )
    Ci dessous un jeu de test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    INSERT INTO `table` VALUES (123, '459', '4554', '134', '13G11', 'XXX', 'YYY', '1340041', '00007');
    INSERT INTO `table` VALUES (123, '459', '4554', '134', '13G11', 'XXX', 'SSS', '1340041', '');
    INSERT INTO `table` VALUES (124, '459', '4554', '134', '13G11', 'HHH', 'LLL', '1348974', '00005');
    INSERT INTO `table` VALUES (123, '459', '4554', '134', '13G15', 'RRR', 'NNN', '1340051', '00002');
    INSERT INTO `table` VALUES (125, '459', '4554', '134', '13G15', 'HHH', 'GGG', '1343702', '');
    INSERT INTO `table` VALUES (123, '459', '4554', '134', '13G11', 'WWW', 'DDD', '1340041', '');
    On dira qu'il y'a doublons dans le tableau lorsque pour les champs Id1 et PPP on a la même valeur.

    Dans ma table on peut donc dire que les enrégistrements 1, 2 et 6 sont des doublons puisque les deux champs (Id1 et PPP) ont la même valeur. Le but de ma manoeuvre est donc de supprimer les enrégistrements doublons et conserver uniquement celui pour lequel le champ TTT n'est pas vide (ici cela revient à supprimer les enrégistrements 2 et 6)

    Je veux donc passer de la table

    Id1 Id2 Id3 AAA PPP NNN OOO CCC TTT

    123 459 4554 134 13G11 XXX YYY 1340041 00007
    123 459 4554 134 13G11 XXX SSS 1340041

    124 459 4554 134 13G11 HHH LLL 1348974 00005
    123 459 4554 134 13G15 RRR NNN 1340051 00002
    125 459 4554 134 13G15 HHH GGG 1343702
    123 459 4554 134 13G11 WWW DDD 1340041

    à celle ci :
    Id1 Id2 Id3 AAA PPP NNN OOO CCC TTT
    123 459 4554 134 13G11 XXX YYY 1340041 00007
    124 459 4554 134 13G11 HHH LLL 1348974 00005
    123 459 4554 134 13G15 RRR NNN 1340051 00002
    125 459 4554 134 13G15 HHH GGG 1343702


    J'ai essayé de faire un SELECT DISTINCT sur les deux champs concernés Id1,CCC et j'obtiens bien les doublons mais sans les autres champs et je ne sais comment les supprimer. Si quelqu'un pouvait m'éclairer je serai ravis.

    PS: J'utilise comme SGBDR Mysql et je travaille en local avec PhpMyadmin

    Merci d'avance.

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 283
    Points : 11 742
    Points
    11 742
    Par défaut
    Deux remarques :

    1/ tu confonds le NULL et la chaîne vide, qui n'ont rien à voir

    2/ ta table n'a pas de clé primaire (à moins que ce ne soit la combinaisons id1/id2/id3), du coup tu risques que la ligne 5, où TTT est une chaîne vide, soit considérée comme un doublon d'elle-même avec la méthode que je te propose

    Du coup, je commence par ajouter une ID :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE `matable` 
    ADD `ID` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST ;
    Maintenant, je demande la suppression des lignes ou TTT = '' et pour lesquelles il existe un doublon sur ID1 et PPP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    delete from t1 -- lignes à supprimer
    using matable t1 
      inner join matable t2 -- lignes à conserver
        on t1.id1 = t2.id1 and t1.ppp = t2.ppp 
          and t1.id <> t2.id -- évite qu'une ligne soit son propre doublon
    Where t1.ttt = ''
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Bonjour ,
    pour cette proposition de solution Antoun. Elle correspond exactement à ce que je comptais faire.
    Mes doublons sont assez particuliers mais grâce à cette requête je suis arrivé à les supprimer.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Simuler l'exécution d'une requête (my)sql
    Par slimane.3 dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 24/05/2006, 21h16
  2. Recupérer le 1er enr d'une requète en SQL
    Par marot_r dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 31/03/2006, 22h38
  3. Interrompre une requête PL/SQL demandée par le Web
    Par PierreV01 dans le forum PL/SQL
    Réponses: 1
    Dernier message: 12/12/2005, 10h52
  4. requête query sql
    Par bertrand_declerck dans le forum Bases de données
    Réponses: 13
    Dernier message: 30/06/2005, 14h59
  5. petit probleme dans une requte POSTGRE SQL
    Par ghis le fou dans le forum Requêtes
    Réponses: 5
    Dernier message: 08/09/2003, 13h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo