Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/12/2006, 14h49   #1
Membre du Club
 
Inscription : novembre 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 120
Points : 55
Points : 55
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 :
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 :
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 ?
beberd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2006, 16h22   #2
Membre du Club
 
Inscription : novembre 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 120
Points : 55
Points : 55
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
beberd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2006, 16h29   #3
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
c'est quoi "l'idée du matchcode" ?
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2006, 16h42   #4
Membre du Club
 
Inscription : novembre 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 120
Points : 55
Points : 55
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.
beberd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2006, 20h59   #5
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
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 :
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 ?
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2006, 09h43   #6
Membre du Club
 
Inscription : novembre 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 120
Points : 55
Points : 55
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
beberd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2006, 23h45   #7
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
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 !
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2006, 09h46   #8
Membre du Club
 
Inscription : novembre 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 120
Points : 55
Points : 55
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.
beberd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2007, 11h41   #9
Membre chevronné
 
Avatar de pop_up
 
Inscription : avril 2006
Messages : 833
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : avril 2006
Messages : 833
Points : 690
Points : 690
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 :
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 :
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
pop_up est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h55.


 
 
 
 
Partenaires

Hébergement Web