Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1367 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Mise à jour conditionnelle et comparaison de 2 tables

 


Sujet(s) à lire :
 

 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Mise à jour conditionnelle et comparaison de 2 tables

n°2215148
maestro130​3
Posté le 06-01-2014 à 23:23:35  profilanswer
 

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.

mood
Publicité
Posté le 06-01-2014 à 23:23:35  profilanswer
 

n°2215162
poulpeleac​h
Octopus paradisi
Posté le 07-01-2014 à 08:12:58  profilanswer
 

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.

n°2215215
maestro130​3
Posté le 07-01-2014 à 14:37:22  profilanswer
 

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.

n°2215218
poulpeleac​h
Octopus paradisi
Posté le 07-01-2014 à 14:45:10  profilanswer
 

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
n°2215272
maestro130​3
Posté le 07-01-2014 à 21:08:52  profilanswer
 

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
n°2215276
poulpeleac​h
Octopus paradisi
Posté le 07-01-2014 à 21:14:12  profilanswer
 

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...

n°2215303
maestro130​3
Posté le 08-01-2014 à 09:15:18  profilanswer
 

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  

n°2215312
poulpeleac​h
Octopus paradisi
Posté le 08-01-2014 à 10:14:35  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Mise à jour conditionnelle et comparaison de 2 tables

 

Sujets relatifs
Mise à jour version Tcl/TkSynchronisation 2 tables dans 2 DB différentes
determiner le jour d'une date en pythonrequete mysql ou comparaison de tableaux php ?
MySql mes tables sont la mais je ne les vois pasSélectionner les lignes de la date du jour + Verrouiller emplacement
comparer et mettre a jour 2 tables en SQLVBA - couleur texte cellule en fonction du jour
Plus de sujets relatifs à : Mise à jour conditionnelle et comparaison de 2 tables


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR