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

SQL Procédural MySQL Discussion :

Problème de boucles


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 120
    Par défaut Problème de boucles
    Bonjour,

    Je suis désolé de ce qui va suivre, mais je ne voyait pas d'autres moyens de vous montrer mon problème sans vous présenter l'ensemble de ce que je voulais faire !!!

    clients:
    id rs adresse cp ville

    Je créer ue procédure pour dédoublonner ma table clients, en utilisant l'idée du matchcode

    - La création du matchcode sur 12 charactères se passe bien.
    Le découpage du matchcode charactère/ charactère dans 12 champs de clients fonctionne parfaitement.

    Après cette étape je me retrouve donc avec une table clients comprenant:

    clients
    id rs adresse cp ville matchcode N1... N12.

    Le but de ce decoupage est de vérifier l'existence dans ma table que pour la ligne 1 (table clients) N1 il n'existe pas de N1 identique.
    Si c'est le cas les champs R1.... R12 que je crée à ce moment là prend la valeur 1 sinon la valeur 0
    Après un premier passage je compte R1+...+R12 et en fonction d'un certain lambda je sors les lignes correspondantes.

    Voilà le but et le fonctionnement théorique de ma fonction !!!!

    Thecniquement mon code se présente ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    2 Curseurs identiques:
    declare cursor select N1...N12 from clients
    
    2 Boucles while:
    chacune stockant dans des variables les valeurs de ces 2 curseurs
    
    les différents jeux de test sur ces variables
    
    Insertion des doublons dans la table doublon
    Compte tenu d'un grand nombre d'erreur j'ai décidé d'effectuer ce test:

    clients:
    2 lignes de données
    id adresse rs cp ville matchcode N1..N12 .....
    1213
    12

    Test :
    TATA TOTO

    J'utilise toujours mes 2 boucles de la même facon, sauf que je fais sauter mes tests sur les variables et que j'utilise juste les syntaxes de boucles.
    J'insert ensuite id et rs dans test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while
    implémentation curseur1 dans variable => ligne1 puis ligne 2 clients
       while 
       implémentation curseur2 dans variable => ligne 1 puis ligne2 clients
       if id_cur1 <> id_cur2
       insert into test(TATA, TOTO)
       select id,rs from clients;
       end while;
    end while;
    Je pensais ainsi me retrouver avec 2 lignes dans ma table hors j'en ai 4!!!!!
    1213
    12
    1213
    12


    C'est comme si chaque boucle était exécuté 2 fois !!
    Quelqu'un aurait-il une idée comment cela arrive ? est-ce normal ?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 120
    Par défaut
    Je vois que très peu ont eu le courage de se poser sur ce petit problème !!

    Si il y a des courageux !!! Merci à vous

  3. #3
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 287
    Par défaut
    c'est quoi "l'idée du matchcode" ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 120
    Par défaut
    Je suis partie d'un site datalgo.fr qui explique diverses méthodes pour dédoublonner des données clientes:

    par rs, par adresse, par combinaison rs+cp
    par utilisation du Soundex
    par mise au norme des données ( 3 PL de la REP devient 3 PLACE DE LA REPUBLIQUE)

    Le matchcode lui, est une concaténation de certains charactères choisies sur les champs rs ville cp adresse ....
    Libre a chacun de définir ce matchcode.
    ainsi par exemple:

    TOTO 3 PLACE DE LA REPUBLIQUE 37150 BEAUJEU -> TOCE DE37BEAU
    TOTA 4 PLACE DE LA REPUBLIQUE 36150 BEAUJEU -> TOCE DE36BEAU

    En définissant un taux lambda (75%), on peut ainsi recoupler des données qui n'auraient pas été reconnu comme doublon sur les Test du soundex(adresse), ou simplement par combinaison Adresse Ville,

    C'est une méthode supplémentaire pour dédoublonner les données.

  5. #5
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 287
    Par défaut
    Citation Envoyé par beberd
    clients
    id rs adresse cp ville matchcode N1... N12.

    Le but de ce decoupage est de vérifier l'existence dans ma table que pour la ligne 1 (table clients) N1 il n'existe pas de N1 identique.
    Si j'ai bien compris, tu peux détecter tes doublons ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT *
    FROM clients C1
      INNER JOIN clients C2 
        ON C1.matchcode = C2.matchcode 
            AND C1.id < C2.id
    est-ce que ça te suffit ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 120
    Par défaut
    J'y avais pensé mais dans ce cas je en gère que les matchcodes identiques alors que mon but est de traité l'existence d'un matchcode à 75% minimum identique

    Identique au niveau des caractères et au niveau de leurs places dans le matchcode !!!

    La différence est là !

    C'est pourquoi je souhaite travailler sur 2 boucles et comparer chaque caractères du matchcode

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 287
    Par défaut
    Citation Envoyé par beberd
    J'y avais pensé mais dans ce cas je en gère que les matchcodes identiques alors que mon but est de traité l'existence d'un matchcode à 75% minimum identique

    Identique au niveau des caractères et au niveau de leurs places dans le matchcode !!!
    Dans ce cas, crée plutôt une fonction Ressemblance(matchcode1, matchcode2) qui calcule un taux de similarité, et fais la requête avec une jointure sur Ressemblance(C1.matchcode, C2.matchcode) > .75.

    Citation Envoyé par beberd
    La différence est là !
    C'est pourquoi je souhaite travailler sur 2 boucles et comparer chaque caractères du matchcode
    2 boucles, ok, mais 2 curseurs c'est double beuâaaark !

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 120
    Par défaut
    Citation Envoyé par Antoun
    Dans ce cas, crée plutôt une fonction Ressemblance(matchcode1, matchcode2) qui calcule un taux de similarité, et fais la requête avec une jointure sur Ressemblance(C1.matchcode, C2.matchcode) > .75.
    Je suis d'accord avec ton idée mais pour faire fonctionner cette fonction, il me faudra 2 boucles avec malheureusement 2 curseurs car j'ai besoinde cette implémentation pas à pas pour l'insertion de mes doublons SI il y en a.

    C'est pourquoi j'ai besoin de marquer le pas sur chacune des implémentations de la boucle 2 et le mieux reste le curseur.

  9. #9
    Membre émérite Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Par défaut
    Est ce que tu as toujours besoin d'aide sur ce probleme ?

    parce que je viens d'avoir un peu le meme probleme avec un curseur.

    En gros ma structure etait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    WHILE NOT v_cur_done DO
       FETCH mon_curseur
            ecriture d'une chaine
    END WHILE;
    En réalité j'aurai du avoir qu'une seule chaine car il y avait qu'un seul tuple dans ma table mais il se trouve que j'avai deux lignes ecrites.

    en fait, quand il rentre dans la boucle une seconde fois, la condition du while est toujours passante car le FETCH n'a pas encore été effectué mais si tu fais ceci ca marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    WHILE NOT v_cur_done DO
       FETCH mon_curseur
            IF NOT v_cur_done THEN
                 ecriture d'une chaine
            END IF;
    END WHILE;
    voila si ca peut t'aider

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

Discussions similaires

  1. Problème de boucles imbriquées
    Par Gnux dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 09/12/2005, 20h26
  2. [Tableaux] Problème avec boucle
    Par MYster dans le forum Langage
    Réponses: 6
    Dernier message: 11/11/2005, 18h39
  3. Problème de boucle
    Par TheUltimaSephiroth dans le forum C
    Réponses: 8
    Dernier message: 10/10/2005, 13h58
  4. Problème de boucle
    Par Louis-Guillaume Morand dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/09/2005, 09h10
  5. Problème de boucle
    Par basclln dans le forum C++
    Réponses: 19
    Dernier message: 02/04/2005, 09h13

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