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

Langage SQL Discussion :

[Access 2003] Fusion d'enregistrements dans une table


Sujet :

Langage SQL

  1. #1
    Membre du Club Avatar de PhRey
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 197
    Points : 67
    Points
    67
    Par défaut [Access 2003] Fusion d'enregistrements dans une table
    Bonjour,
    j'ai des lignes en double dans une table client.
    Je souhaiterai les fusionner.

    Exemple dans ma table :

    Ligne 1 : Client A / Adresse / Nom / Prenom / Genre
    Ligne 2 : Client A / Adresse / "vide"/ "vide" / Genre
    Ligne 3 : Client B / Adresse / "vide" / Prenom / "vide"
    Ligne 4 : Client B / "vide" / Nom / Prenom / "vide"
    etc...
    Je desire fusionner les infos de mon client A "ligne 2" dans les infos de mon client A 'ligne 1", client B "ligne 4" dans les infos de mon client 2 "ligne 3" etc... pour chaque client garder uniquement la 1ere ligne completée de la seconde, puis faire disparaitre la seconde.

    Comment dois je formuler ma requete svp ?
    Update... ???

    Pouvez vous m'aider svp ?

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Donnez-nous :
    - le nom de votre SGBD et sa version
    - la structure de cette table

    Citation Envoyé par PhRey
    pour chaque client garder uniquement la 1ere ligne completée de la seconde, puis faire disparaitre la seconde
    il faut donc procéder en 2 temps : UPDATE puis DELETE (ou TRUNCATE).
    Cependant, j'aimerais savoir sur quelle colonne vous vous appuyez (clé primaire auto-incrémentée, séquence, etc.) pour déterminer l'ordre des lignes dans votre table ?

  3. #3
    Membre du Club Avatar de PhRey
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 197
    Points : 67
    Points
    67
    Par défaut
    Je travaille avec Access2003 sur une base client (une seule table).
    Cette table a un champs NumAuto avec clé primaire, detyerminant un numero disctinct pour chaque nouvel enregistrement (en thorie, pour chaque client)

    Il se trouve que j'ai des clienbts en double (portant des Numauto different) mais portant le meme nom (strictement).

    Je desire donc fusionner ces client en double.

    Le client dont il faut recuperer les infos puis supprimer l'enregistrement, a tjrs un NumAuto plus grand puisqu'il a été rajouté aprés ! (c'est le truc sur quoi m'appuyer je pense)

  4. #4
    Membre du Club Avatar de PhRey
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 197
    Points : 67
    Points
    67
    Par défaut
    Personne n'a d'idée pour un petit coup de main svp ?
    A moins que ma demande soit mal formulée ?

    J'ai tenté de m'y prendre autrement. Disposant des 2 tables avant "fusion", j'ai utilisé une requete "Rajout" qui prend les données de la table A et les rajoute dans la table B. Mon pb est que je me retrouve avec le double d'enregistrements evidement !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO Contacts ( [COMMUNE 01], SUIVI, dates, EQUIPEMENT )
    SELECT Contacts_pascal.[COMMUNE 01], Contacts_pascal.SUIVI, Contacts_pascal.dates, Contacts_pascal.EQUIPEMENT
    FROM Contacts_pascal;
    Je desire donc filtrer ce rajout pour que les enregistrements se fusionnent d'aprés le champs "Commune 01" qui est identique dans les 2 tables.
    Et si la commune est identique, alors remplacer les données de la "table cible" ("Contacts) par les données de la "table de depart" ("Contacts_pascal")) dans les champs specifiés...

    Pouvez vous m'aider a mettre en place cette condition svp ?

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Voici un début de solution : la sous-requête suivante ramène pour chaque client la 1ère ligne créée.
    Il vous faut utiliser cette sous-requête comme critère de filtre de votre requête UPDATE.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    10g SOC5> select *
      2  from dvp;
     
            ID CLIENT                    ADR                       VILLE
    ---------- ------------------------- ------------------------- -------------------------
            15 A                         ADR 1
            16 A                                                   VILLE 1
            64 B                         ADR 2
            65 B                                                   VILLE 2
            66 B                         ADR 2 BIS
     
    5 ligne(s) sélectionnée(s).
     
    10g SOC5> SELECT ID, CLIENT, ADR, VILLE
      2  FROM   DVP D1
      3  WHERE  NOT EXISTS ( SELECT *
      4                      FROM   DVP D2
      5                      WHERE  D1.CLIENT = D2.CLIENT
      6                      AND    D2.ID < D1.ID );
     
            ID CLIENT                    ADR                       VILLE
    ---------- ------------------------- ------------------------- -------------------------
            64 B                         ADR 2
            15 A                         ADR 1
     
    2 ligne(s) sélectionnée(s).
    Cependant, si le client est un libellé et non un identifiant vous pourriez ne pas avoir le résultat attendu pour des motifs de casse, d'espacements, etc.
    Enfin, dans l'exemple que j'ai pris pouvez-vous me donner la ville que vous attendez pour le client B ?
    En effet, il existe 2 lignes ayant la ville renseignée ; laquelle doit-on prendre ?

  6. #6
    Membre du Club Avatar de PhRey
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 197
    Points : 67
    Points
    67
    Par défaut
    Dabord merci pour votre aide !

    En fait les données des 2 tables sont issues d'une meme table (il y a longtps).
    Elles sont donc formatées pareil.
    Les casses, les cham^ps etc.. sont strictement identiques.

    Precision : on ne retrouve que 2 fois un meme client dans la table. Jamais plus. Le seul point commun entre chaque client est le nom de la commune (strictement ecrit pareil). C'est sur ce critere qu'il faut s'appuyer je pense.


    Exemple de champs de ma table client :
    Commune 01 / suivi / dates / equipement / adresse
    Exemple d'enregistrements a fusionner :

    chps : Commune 01 / suivi / dates / equipement / adresse
    cltA : marseille /ok /"null" /télé / ICI
    cltB : marseille /"null" /"null" /téléphone /"null"

    Ces 2 clients ont de NumAuto differents (le plus grand etant tjrs associés au cltB) et ont des noms de "commune 01" strictement identiques.

    Je desire donc fusionner le cltB vers le cltA en remplacants les infos du cltA dans les champs specifiés (ici en gras). Le reste des chps du cltA ne doivent pas changer.

    Resultat fusion :
    chps : Commune 01 / suivi / dates / equipement / adresse
    cltA : marseille /"null" /"null" /téléphone / ICI
    (cltB supprimé)
    C'est en fait assez simple mais difficile a expliquer bizarrement...

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Cette requête devrait répondre à votre demande mais sachez qu'elle n'est pas conforme vis-à-vis de la norme SQL à cause de l'alias sur la table concernée par l'UPDATE.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    10g SOC5> select *
      2  from dvp;
     
            ID CLIENT                    ADR                       VILLE
    ---------- ------------------------- ------------------------- -------------------------
            15 A                         ADR 1
            16 A                                                   VILLE 1
            64 B                         ADR 2
            65 B                                                   VILLE 2
     
    4 ligne(s) sélectionnée(s).
     
    10g SOC5> UPDATE DVP D1
      2  SET D1.ADR = ( SELECT D2.ADR
      3                 FROM   DVP D2
      4                 WHERE  D1.CLIENT = D2.CLIENT
      5                 AND    D2.ID > D1.ID ),
      6      D1.VILLE = ( SELECT D2.VILLE
      7                   FROM   DVP D2
      8                   WHERE  D1.CLIENT = D2.CLIENT
      9                   AND    D2.ID > D1.ID )
     10  WHERE  NOT EXISTS ( SELECT *
     11                      FROM   DVP D2
     12                      WHERE  D1.CLIENT = D2.CLIENT
     13                      AND    D2.ID < D1.ID );
     
    2 ligne(s) mise(s) à jour.
     
    10g SOC5> select *
      2  from dvp;
     
            ID CLIENT                    ADR                       VILLE
    ---------- ------------------------- ------------------------- -------------------------
            15 A                                                   VILLE 1
            16 A                                                   VILLE 1
            64 B                                                   VILLE 2
            65 B                                                   VILLE 2
     
    4 ligne(s) sélectionnée(s).
    Satisfait ?

  8. #8
    Membre du Club Avatar de PhRey
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 197
    Points : 67
    Points
    67
    Par défaut
    Ca semble genial, mais comment l'utiliser dans Access ? Il est "bizarre" ce tableau pour moi ?

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Quel tableau ?
    J'ai fait un copier-coller de SQL*Plus qui est un outil dont on sert pour accéder à une base Oracle.
    Utilisez (en l'adaptant bien sûr) la requête UPDATE de mon dernier message.

  10. #10
    Membre du Club Avatar de PhRey
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 197
    Points : 67
    Points
    67
    Par défaut
    Citation Envoyé par Magnus
    Quel tableau ?
    J'ai fait un copier-coller de SQL*Plus qui est un outil dont on sert pour accéder à une base Oracle.
    Utilisez (en l'adaptant bien sûr) la requête UPDATE de mon dernier message.
    Ok je crois saisir..

    Mais par contre le resultat n,'est pas tout a fait ce que je deisre, je vais tenter de l'adapter. En partant de cet etat :
    ID CLIENT ADR VILLE
    ---------- ------------------------- ------------------------- -------------------------
    15 A ADR 1
    16 A VILLE 1
    64 B ADR 2
    65 B VILLE 2

    ... je desire obtenir ceci (fusion des données clients):
    ID CLIENT ADR VILLE
    ---------- ------------------------- ------------------------- -------------------------
    15 A ADR 1 VILLE 1
    64 B ADR 2 VILLE 2
    Encore merci pour ce beau coup de main !!!
    Je me remet au boulot !

  11. #11
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Sous Oracle, je procèderai en une seule requête UPDATE mais je crains que vous ne disposiez pas des fonctions que j'utiliserais, donc je vous propose de décomposer votre traitement en autant de requêtes UPDATE que vous avez de colonnes à mettre à jour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    UPDATE DVP D1
    SET D1.ADR = ( SELECT D2.ADR
                   FROM   DVP D2
                   WHERE  D1.CLIENT = D2.CLIENT
                   AND    D2.ID > D1.ID )
    WHERE  NOT EXISTS ( SELECT *
                        FROM   DVP D2
                        WHERE  D1.CLIENT = D2.CLIENT
                        AND    D2.ID < D1.ID )
    AND D1.ADR IS NULL;
     
     
    UPDATE DVP D1
    SET D1.VILLE = ( SELECT D2.VILLE
                     FROM   DVP D2
                     WHERE  D1.CLIENT = D2.CLIENT
                     AND    D2.ID > D1.ID )
    WHERE  NOT EXISTS ( SELECT *
                        FROM   DVP D2
                        WHERE  D1.CLIENT = D2.CLIENT
                        AND    D2.ID < D1.ID )
    AND D1.VILLE IS NULL;

  12. #12
    Membre du Club Avatar de PhRey
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 197
    Points : 67
    Points
    67
    Par défaut
    Merci encore Magnus ! Ton aide m'est precieuse !

    J'ai cependant trouver un moyen bcp plus simple de resoudre mon probleme, en partant de mes 2 tables initiales donc j'opere avant cette fusion (qui me crée chaque client en double) qui finalement est plus difficile à gerer !

    J'ai donc 2 tables quasi identiques, meme nb de clients, meme noms, meme nb de champs, etc...

    Et je recupere les données de l'une dans l'autre, champs par champs (car la mise à jour de tous les champs ne m'interesse pas, au contraire !) en faisant ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE tableA INNER JOIN tableB ON tableA.[nom_client]=tableB.[nom_client] SET tableA.[dates] = tableB.[dates];
    Ici je mets à jour le champs "dates" de tous les clients de la tableA en m'appyant sur le nom des clients, que je sais commun aux 2 tables...
    (tellement facile qd on connait un minimum de syntaxe sql !)

    Bref, je m'en sors encore avec une pirouette, & surtout merci 1000 fois pour tout le mal que tu te donnes ! On se sent moi seul et aidé !

  13. #13
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par PhRey
    (tellement facile qd on connait un minimum de syntaxe sql !)
    Et non, car votre solution ne figure ABSOLUMENT pas dans la norme SQL
    J'en veux pour preuve que Oracle par exemple ne supporte pas cette syntaxe.

    Dans tous les cas, si votre problème est résolu merci de clore votre sujet.

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

Discussions similaires

  1. Problème d'enregistrement dans une table Access
    Par sebbonard dans le forum VB.NET
    Réponses: 5
    Dernier message: 30/10/2012, 22h01
  2. Réponses: 1
    Dernier message: 26/08/2009, 08h41
  3. Classer des enregistrements dans une table Access
    Par midasios dans le forum VBA Access
    Réponses: 7
    Dernier message: 20/05/2008, 20h57
  4. Réponses: 4
    Dernier message: 10/12/2006, 16h47
  5. Réponses: 7
    Dernier message: 07/06/2006, 07h32

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