Mise à jour conditionnelle et comparaison de 2 tables - SQL/NoSQL - Programmation
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.
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.
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
);
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
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...
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
Marsh Posté le 08-01-2014 à 10:14:35
C'est correct sous Oracle
Essaie avec "delete from NomTable2" au début?
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.