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

C++ Discussion :

Jointure entre 2 tables


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Par défaut Jointure entre 2 tables
    Bonjour à tous,

    J'ai 2 tables de données (pb40 et pb10) avec un identifiant commun (idlocal); je dois rajouter un champ (dteloc) de la table "pb10" à la table "pb40". Le code ci-dessous fonctionne mais n'existe-t-il pas un algorithme plus rapide car compte tenu que chacune des 2 tables fait environ 700 000 lignes, ça prend plus de 5 minutes à chaque requête...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for (unsigned int i = 0; i < pb40.size(); ++i)
         for (unsigned int j = 0; j < pb10.size(); ++j)
             if (strcmp(pb40[i].idlocal.c_str(), pb10[j].idlocal.c_str()) == 0){
                  pb40[i].dteloc = pb10[j].dteloc;
                  break;
             }
    Merci pour toute bonne idée !

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Avec une map ça irait plus vite:
    - une passe pour créer la map à partir de pb10 (id_local - dteloc)
    - une passe sur pb40 qui pour chaque élément cherche dans la map et met à jour dteloc

    Soit 700 000 *2 itérations.
    (Au lieu de 700 000 * 700 000 !)

  3. #3
    Membre confirmé
    Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Par défaut
    Citation Envoyé par Nudger Voir le message
    Bonjour,

    Avec une map ça irait plus vite:
    - une passe pour créer la map à partir de pb10 (id_local - dteloc)
    - une passe sur pb40 qui pour chaque élément cherche dans la map et met à jour dteloc

    Soit 700 000 *2 itérations.
    (Au lieu de 700 000 * 700 000 !)
    Super ! merci...

  4. #4
    Membre confirmé
    Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Par défaut
    Citation Envoyé par Nudger Voir le message
    Avec une map ça irait plus vite:
    - une passe pour créer la map à partir de pb10 (id_local - dteloc)
    - une passe sur pb40 qui pour chaque élément cherche dans la map et met à jour dteloc

    Soit 700 000 *2 itérations.
    (Au lieu de 700 000 * 700 000 !)
    Pour ceux que ça intéresse, voilà la traduction en code; on passe de 5 minutes de traitement à 1,34 secondes... Woouahhh !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    map<string, int> creation_map;
     
    for (unsigned int i = 0; i < pb10.size(); ++i)
         creation_map[pb10[i].idlocal] = pb10[i].dteloc;
     
    map<string, int>::iterator jointure;
     
    for (unsigned int i = 0;  i < pb40.size(); ++i){
         jointure = creation_map.find(pb40[i].idlocal);
         if (pb40[i].idlocal == jointure->first)
               pb40[i].dteloc = jointure->second;
    }

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

Discussions similaires

  1. PROBLEME DE JOINTURE ENTRE DEUX TABLE
    Par DarkMax dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/01/2005, 15h11
  2. Jointure entre 3 tables
    Par zigune dans le forum Langage SQL
    Réponses: 9
    Dernier message: 15/11/2004, 16h04
  3. Jointure entre deux tables et résultat
    Par Asdorve dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/06/2004, 14h50
  4. [jointure]requete possible de double jointure entre 2 tables
    Par akira_le_gaucher dans le forum Langage SQL
    Réponses: 4
    Dernier message: 11/05/2004, 15h03
  5. Jointure entre 2 tables et OR
    Par PyRoFlo dans le forum Requêtes
    Réponses: 2
    Dernier message: 02/02/2004, 18h42

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