Mise à jour conditionnelle et comparaison de 2 tables

Mise à jour conditionnelle et comparaison de 2 tables - SQL/NoSQL - Programmation

Marsh Posté le 06-01-2014 à 23:23:35    

Bonjour à tous, meilleurs vœux pour le nouvel an!
 
J'ai 2 tables t1 et T2 ayant pratiquement la même structure
elles ont  une clé auto-incrément  
Je parcours t1 et écris éventuellement dans t2
 
t1(clé, indice, x1,x2,x3,...)
 
t2(clé, indice, x1,x2,x3,...)
 
[I]Si je trouve que T1.indice=T2.indice alors
 
si min(t1.x1,t1.x2,t1.x3)< min(t2.x1,t2.x2,t2.x3) alors l'enregistrement est supprimé dans t2 et remplacé par son vis à vis de t1;et on passe au suivant. Sinon il n'y a pas d'écriture dans t2 et l'enregistrement est supprimé dans T1; et on passe au suivant.
[/I]
Or je ne connais que les commandes SQL simples! sans structure de contrôle(pas de case, while, for, if ...) .  
 
Est ce que quelqu'un peut m'aider à effectuer cette tâche sous Mysql 5.1.52-community-log de façon plus rapide et plus efficace.  
 
Merci infiniment.

Reply

Marsh Posté le 06-01-2014 à 23:23:35   

Reply

Marsh Posté le 07-01-2014 à 08:12:58    

Un truc du genre (je connais pas trop ce qui est possible sous MySQL, je fais comme je ferai sous Oracle) :  
 
delete NomTable2 where indice in (
 select T1.indice
 from NomTable1 T1 a inner join NomTable2 T2 on T1.indice=T2.indice  
  where min(T1.x1,T1.x2,T1.x3)< min(T2.x1,T2.x2,T2.x3)
);
 
insert into NomTable2 (
  select T1.indice, T1.x1,T1 .x2,T1 .x3
 from NomTable1 T1 a left outer join NomTable2 T2 on T1.indice=T2.indice  
  where  T2.indice is null
);
 
La première requete enleve de T2 les lignes dont le min est > à celui de T1, la deuxieme insere dans T2 les lignes de T1 dont l'indice n'est pas dans T2.

Reply

Marsh Posté le 07-01-2014 à 14:37:22    

Merci beaucoup poulpeleach,
Quelque chose me dit que ça va mrcher sous MySQL aussi.
 
Je  teste la requête et je vous tiens au courant.
 
Mille merci. Et A bientôt.

Reply

Marsh Posté le 07-01-2014 à 14:45:10    

Si le min entre une liste de colonnes marche pas,
essaie un truc du genre :

 

delete NomTable2 where indice in (
 select V1.indice
 from (
    select T1_1.indice, T1_1.x1 as mini
    from NomTable1 T1_1
    where T1_1.x1 < T1_1.x2 and T1_1.x1 <T1_1.x3
   
    union
 
    select T1_2.indice, T1_2.x2 as mini
    from NomTable1 T1_2
    where T1_2.x2 < T1_2.x1 and T1_2.x2 <T1_2.x3

 

   union
 
    select T1_3.indice, T1_3.x3 as mini
    from NomTable1 T1_3
    where T1_3.x3 < T1_3.x1 and T1_3.x3 <T1_3.x2
 ) V1  inner join
 (
     select T2_1.indice, T2_1.x1 as mini
    from NomTable2 T2_1
    where T2_1.x1 < T2_1.x2 and T2_1.x1 <T2_1.x3
   
    union
 
    select T2_2.indice, T2_2.x2 as mini
    from NomTable2 T2_2
    where T2_2.x2 < T2_2.x1 and T2_2.x2 <T2_2.x3

 

   union
 
    select T2_3.indice, T2_3.x3 as mini
    from NomTable2 T2_3
    where T2_3.x3 < T2_3.x1 and T2_3.x3 <T2_3.x2
 )  V2 on V1.indice=V2.indice  
  where V1.mini < V2.mini
);


Message édité par poulpeleach le 07-01-2014 à 14:45:39
Reply

Marsh Posté le 07-01-2014 à 21:08:52    

Bonjour,
 
Que signifie pour vous la notation T1_3,T2_3 ?  
Aussi NomTable2,  NomTable1, V1 et V2
je crois que le reste est OK.
 
Merci


Message édité par maestro1303 le 07-01-2014 à 21:11:23
Reply

Marsh Posté le 07-01-2014 à 21:14:12    

Tx_y se sont des alias.
NomTable1 et NomTable2 ca correspond à tes T1 et T2, qui, je suppose, s apellent pas comme ca en vrai...

Reply

Marsh Posté le 08-01-2014 à 09:15:18    

Bonjour poulpeleach;
Merci pour tout ce que vous faites. Mais je rencontre cette erreur
 

Citation :

#1064 - Erreur de syntaxe près de 'where indice in ( select V1.indice from ( select t1.indice, t1' à la ligne 1


est ce qu'on peut essayer avec les noms directs des tables et des champs sans utiliser les alias?
 
Merci infiniment  

Reply

Marsh Posté le 08-01-2014 à 10:14:35    

C'est correct sous Oracle :(  
Essaie avec "delete from NomTable2" au début?

Reply

Sujets relatifs:

Leave a Replay

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