[MYSQL] Update un peu tordu

Update un peu tordu [MYSQL] - SQL/NoSQL - Programmation

Marsh Posté le 25-07-2007 à 12:36:00    

Bonjour,
 
Je cherche à faire un dédoublonnage sur une table d'appelant. C'est à dire que je trouve tous les doublons, je met à jour les infos entre ces doublons, et je supprime les surnuméraires. Par doublons, j'entend des appelants avec le même nom, prénom, et numéro de téléphone. Ces doublons sont souvent créés par erreur par une opératrice qui recrée un appelant, parfois avec des infos supplémentaires (adresse, numéro de portable) au lieu de mettre à jour l'ancien appelant.
 
Je doit donc trouver toutes les lignes avec le même nom et n° de tel, et, pour chaque champ, le mettre à jour à partir des autres doublons si le champ d'origine est vide ou qu'un champ renseigné modifié plus recemment existe.
 
Pour ce qui est de la suppression en elle-même, je n'y suis pas et de toute façon je ne m'en fait pas. Mes premiers tests de suppression fonctionnent. Mon problème, c'est la mise à jour des doublons entre eux. Je n'y arrive pas correctement!!!!
 
Voici ma requète actuelle (je ne m'occupe que d'un seul champ pour le moment):
 
UPDATE cl_appelants AS T1
INNER JOIN cl_appelants AS T2
ON T1.NomAppelant = T2.NomAppelant
   AND T1.Tel1 = T2.Tel1
   AND T1.NumAppelant<>T2.NumAppelant
SET
T1.Rue1=IF(T2.Rue1<>'',IF(T1.Rue1='',T2.Rue1,IF(T2.Modif>T1.Modif,T2.Rue1,T1.Rue1)),T1.Rue1)
 
Les IF imbriqués me permettent normalement de définir si il faut mettre le champ à jour ou pas. Donc SI le champ source n'est pas vide ET (SI le champ à modifier est vide OU SI le champ source a été modifié plus recemment que le champ à modifier)
 
Pour mes tests, j'ai créé 5 doublons. Si je change la valeur du champ du premier doublon, la requete met bien à jour les 4 autres. Si je change la valeur du deuxième doublon, seule la valeur du premier doublon est modifié... Si je change n'importe quel autre doublon, rien ne se passe...
 
Je ne comprend pas pourquoi çà réagit ainsi!!! Alors évidement, dans 90% des cas il n'y aura que deux doublons, et cette requète fonctionnerait. Mais je doit prévoir les cas plus rares avec des doublons multiples, et là je m'en sort pas, mes doublons ne se mettent pas à jour entre eux correctement.
 
Quelqu'un à une idée?

Reply

Marsh Posté le 25-07-2007 à 12:36:00   

Reply

Marsh Posté le 26-07-2007 à 11:27:59    

vraiment personne avec une idée pour me sortir de là?

Reply

Marsh Posté le 12-01-2009 à 19:31:09    

Petit up vu que j'ai le même problème.
 
Merci :)

Reply

Marsh Posté le 12-01-2009 à 21:04:38    

Je sais, je réponds en retard mais peut être que ça t'aidera pour le prochain coup.
 
Ton ensemble de condition me semble bien compliqué. Vu que tu supprimes le second doublon, tu t'en fiches si tu le modifies sauf si le disque est trop lent. Ca permet déjà de simplifier en virant la condition "T2.Modif>T1.Modif". Ensuite, la condition restant correspond à un "si j'ai rien, je met quelque chose". Rien peut être considéré comme vide ou null. Mysql a tout ce qu'il faut pour ça.
 
Au final on peut s'en sortir avec un simple "SET
T1.Rue1=IFNULL(NULLIF(T1.Rue1,"" ),T2.Rue1)".  
 
 
Omniscience > Décrit mieux ton problème, en fonction des éléments qui différent, la solution la plus simple n'est pas forcément la même.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed