Update conditionnel sur MySQL

maestro1303

Nouveau membre
Bonjour,


J'ai deux tables T1 et T2 ayant -à peu près-la même structure

T1
clé,C1,C2,C3

T2
clé,C1,C2,C3

les champs c1,c2 et C3 ont par défaut la valeur '555'

Pour parler des champs c1,c2 et C3 j'utilise Ci

Je dois parcourir T2 et T1
Si je trouve t1.cle=t2.clé alors je mets les données à jour dans t1 de la manière suivante:
[listNum=1]
si (T2.Ci<> '555' et T1.Ci='555' ) alors (update t1 set T1.Ci= T2.Ci)
Si (si (T2.Ci<> '555' et T1.Ci<> '555') et (T2.Ci<T1.Ci)) alors (update t1 set T1.Ci= T2.Ci)

[/listNum]
Enfin je supprime dans T2 l'enregistrement correspondant à t2.cle avec lequel on a fait les updates précédents dans T1.

Ma question : quelle est la requête ou les requêtes SQL pour effectuer cette tâche?

Merci infiniment

 

zeb

Modérateur
Salut,

Ce n'est pas très clair ton affaire !
Il manque au moins de savoir si c'est "quelque soit i" ou "pour tout i", et si i de T1.Ci est le même que celui de T2.Ci.

Propose-nous un test complet, avec tout les C1, C2, C3, qu'on y comprenne quelque chose.
 

maestro1303

Nouveau membre
Salut zeb,
effectivement avec les 'Ci' il y a beaucoup de confusions;
Comme tu l'as si bien souligné on a toujours

i de T1.Ci est le même que celui de T2.Ci

pour cela je pense qu'expliqué comme suit ça serait plus clair:
C++:
if t1.id=t2.id then
if t1.c1='555' and t2.c1<>'555'
update t1 set c1= t2.c1
delete from t2 where t2.id=ID 
endif
if t1.c2='555' and t2.c2<>'555'
update t1 set c2= t2.c2
delete from t2 where t2.id=ID 
endif
if t1.c3='555' and t2.c3<>'555'
update t1 set c3= t2.c3
delete from t2 where t2.id=ID 
endif


if t2.c1< t1.c1
update t1 set c1= t2.c1
delete from t2 where t2.id=ID 
endif
if t2.c2< t1.c2
update t1 set c2= t2.c2
delete from t2 where t2.id=ID 
endif

if t2.c3< t1.c3
update t1 set c3= t2.c3
delete from t2 where t2.id=ID 
endif
Endif

Peut être qu'il faut faire delete séparément

Merci de me dire si je dois aussi proposer des exemples au cas où le charabia plus haut(façon VBA) serait encore confus.
 

zeb

Modérateur
Um....

Tu ne peux pas faire un UPDATE et un DELETE en même temps.
Mais peut-être peux-tu gérer une boucle dans ton programme appelant ou mieux pour des questions de perf, faire une procédure stockée avec un curseur.

Tu peux aussi faire un double UPDATE qui modifiera t1 et t2, en mettant dans t2 une valeur qui signifiera que tu veux supprimer.

Exemple :
SQL:
UPDATE t1 
  JOIN t2 
 USING (id)
   SET t1.c1 = t2.c1, 
       t2.c1 = 'DELETE_ME'
 WHERE (t1.c1 = '555' AND t2.c1 <> t1.c1)
    OR                    t2.c1 <  t1.c1;
...
   
DELETE t2
 WHERE c1 = 'DELETE_ME';
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 134
Messages
6 718 054
Membres
1 586 393
Dernier membre
mathhh28
Partager cette page
Haut