SQL - update dans plusieurs fichiers

SQL - update dans plusieurs fichiers - SQL/NoSQL - Programmation

Marsh Posté le 07-04-2003 à 09:44:59    

Est-ce que qq saurait modifier des valeurs dans 2 tables différentes ayant les mêmes champs.
Table1
(Nom, Prenom, adresse)
Table2
(Nom, Prenom, adresse)
 
Update Table1
set adresse= rue x
where nom=durand
 
je voudrai que les deux fichiers soient modifiés.
Merci  :hello:

Reply

Marsh Posté le 07-04-2003 à 09:44:59   

Reply

Marsh Posté le 07-04-2003 à 09:49:46    

il me semble qu'un update ne peut se rapporter qu'a à une table et une seule à la fois


Message édité par urd-sama le 07-04-2003 à 09:49:58

---------------
.: Clône de Drasche .:. Ebichuleys .:. Avec l'Aloe Vera je fais de beaux cacas [:dawa] .: www.oserselancer.com :.
Reply

Marsh Posté le 07-04-2003 à 09:54:08    

y aurait pas un moyen?

Reply

Marsh Posté le 07-04-2003 à 09:55:20    

faire 2 requêtes  [:spamafote]


---------------
.: Clône de Drasche .:. Ebichuleys .:. Avec l'Aloe Vera je fais de beaux cacas [:dawa] .: www.oserselancer.com :.
Reply

Marsh Posté le 07-04-2003 à 09:55:51    

tout dépends certainement du SGBD.
 
avec SQL Server ou Oracle, tu peux faire ça sans problème.
 
Syntaxe MSSQL :
 
UPDATE A INNER JOIN B ON A.F1=B.F1 SET A.X = 1, B.Y = 2 WHERE A.Z =10
 
Syntaxe Oracle (tourne aussi sous MSSQL) :
 
UPDATE A, B SET A.X = 1, B.Y = 2 WHERE A.F1=B.F1
AND A.Z =10

Reply

Marsh Posté le 07-04-2003 à 09:58:46    

j'aurai appris qqch, merci  :jap:


---------------
.: Clône de Drasche .:. Ebichuleys .:. Avec l'Aloe Vera je fais de beaux cacas [:dawa] .: www.oserselancer.com :.
Reply

Marsh Posté le 07-04-2003 à 10:01:30    

bon, maintenant me me grouille d'aller au taff, ça fait 1 heure que je devrait être en train de mettre en application mon savoir :D

Reply

Marsh Posté le 07-04-2003 à 11:19:03    

Qq aurait-il une autre syntaxe possible car apparemment cette syntaxe ne passe sous AS400?
Merci qd même.  :??:

Reply

Marsh Posté le 07-04-2003 à 11:44:34    

AS400, c'est le serveur. La base de données est à priori un vieux DB2.
 
Fait deux requêtes, DB2 est très merdique au niveau du support SQL standard, alors on ne parle pas des ajouts de la norme SQL 92...

Reply

Marsh Posté le 08-04-2003 à 10:28:49    

En fait je suis en stage et c'est justement ce qu'on me demande, je dois effectuer ces update en même temps, c'est un problème de synchronisation, si les deux requêtes ne sont pas effectuée en même temps, deux enregistrements pourrait être ajoutés dans une table et ne serait pas modifié dans les 2.
 
Je redemande donc à une âme charitable si il n'y pas d'autres syntaxes possibles.

Reply

Marsh Posté le 08-04-2003 à 10:28:49   

Reply

Marsh Posté le 08-04-2003 à 11:14:05    

Concentre-toi sur les transactions et les LOCK de table.
 
Normalement, avec simplement une transaction ça devrait le faire, mais pour être certain, je te conseille de faire manuellement un LOCK sur les deux tables en plus.

Reply

Marsh Posté le 08-04-2003 à 12:01:47    

Si c'est pas trop en demander comment on fait ?

Reply

Marsh Posté le 08-04-2003 à 16:42:42    

Pour le lock, je sais plus.
 
Pour les transactions :
 
begin trans;
update t1 ...;
update t2 ...;
commit;
 
à la place du "commit;" tu peux faire un "rollback;", qui va annuler tout ce qui a été fait depuis le "begin trans;", seulement pour ta session (ça n'altère pas les actions des autres personnes).
 
Normalement, sur un vri SGBD, une transaction porte sur une vue statique des données, c'est à dire que si une personne en // crée/met à jour/supprime des lignes, elle tu ne veras pas les modifs. De plus, tant que t'as pas commité ou rollbacké, les autres utilisateurs ne peuvent pas accéder aux lignes que tu as modifié, mise à part sous certains SGBD, tels qu'Oracle, qui leur permet de voir les lignes dans l'étant avant leur modification.

Reply

Marsh Posté le 08-04-2003 à 16:43:32    

Mais pour les lock et les transactions, leur syntaxe est assez similaire d'un SGBD à l'autre, par contre, leur fonctionnement peut énormément varier d'un SGBD à l'autre, notamment en ce qui concerne l'inter-action avec les autres sessions.

Reply

Marsh Posté le 24-01-2005 à 12:02:52    

MagicBuzz a écrit :

tout dépends certainement du SGBD.
 
avec SQL Server ou Oracle, tu peux faire ça sans problème.
 
Syntaxe MSSQL :
 
UPDATE A INNER JOIN B ON A.F1=B.F1 SET A.X = 1, B.Y = 2 WHERE A.Z =10
 
Syntaxe Oracle (tourne aussi sous MSSQL) :
 
UPDATE A, B SET A.X = 1, B.Y = 2 WHERE A.F1=B.F1
AND A.Z =10


Et un up de la mort :D
 
Quand je fais ça sous Oracle j'ai une erreur (mot clé SET absent), il s'attend à avoir le SET après le nom de la première table :/
C'est dommage je ne voudrai pas être obligé de passer par une procédure stockée.
Y'a pas un paramétrage ou un autre truc à faire pour que ça passe ?


---------------
Ne vous mariez qu'une fois dans votre vie tellement c'est galère © randolfinette | Quand l'antre grogne, le diable cogne... | Un problème d'acquisition VHS?
Reply

Marsh Posté le 24-01-2005 à 12:19:24    

chais pas. quelle version d'Oracle ?

Reply

Marsh Posté le 24-01-2005 à 12:19:41    

Avec la 8i ça marche (je pourrai re-vérifier demain)

Reply

Marsh Posté le 24-01-2005 à 12:24:10    

avec la 9i


---------------
Ne vous mariez qu'une fois dans votre vie tellement c'est galère © randolfinette | Quand l'antre grogne, le diable cogne... | Un problème d'acquisition VHS?
Reply

Marsh Posté le 24-01-2005 à 14:07:09    

bah ça devrait marcher...

Reply

Marsh Posté le 24-01-2005 à 16:28:38    

Je vais devoir faire autrement, c'est dommage ça me plaisait bien et ce n'était pas long à mettre en oeuvre :(


---------------
Ne vous mariez qu'une fois dans votre vie tellement c'est galère © randolfinette | Quand l'antre grogne, le diable cogne... | Un problème d'acquisition VHS?
Reply

Marsh Posté le 24-01-2005 à 16:30:08    

Attends, que demain je teste, il y a peut-être un petit problème dans la requête. Faut juste que j'aie un Oracle sous la main pour tester, et c'est pas le cas actuellement ;)

Reply

Marsh Posté le 24-01-2005 à 16:53:28    

En effet, ça passe pas sous Oracle 9i.
Et je trouve pas d'exemple dans Google qui montreraient qu'on puisse le faire, au contraire :
 
http://www.experts-exchange.com/Da [...] 25051.html
 

Citation :

You can update multiple rows from anywhere you want in one UPDATE statement, but you can't update two tables at the same time). Oracle is expecting the SET keyword straight after the one and only one table name.


 

Citation :

If you want to update two or more tables simultaneously, an alternative is to create an explicit view on the joined tables and create INSTEAD-OF triggers to handle inserts, updates and deletes explicitly. This can be fairly complex but effective if this kind of functionality is required.


 
Confirmé ici aussi:
 
http://dbforums.com/archive/49/2002/04/3/354364


Message édité par Beegee le 24-01-2005 à 16:54:03
Reply

Marsh Posté le 24-01-2005 à 17:50:42    

Etrange, parceque je suis certain d'avoir réussi une fois à faire un truc comme ça.

Reply

Marsh Posté le 24-01-2005 à 17:56:15    

Avec SQL Server apparemment c'est ok, donc tu confonds peut-être ? :)

Reply

Marsh Posté le 24-01-2005 à 18:09:09    

Bon bein merci à tous, en fait ce n'était pas vraiment pour faire l'update de 2 tables mais pour un truc du genre :
 

Citation :


UPDATE TABLE1, TABLE2 SET TABLE1.CHAMP1=TABLE2.CHAMP2 WHERE NOT TABLE1.CHAMP2 IS NULL AND TABLE1.CHAMP1=TABLE2.CHAMP1


 
Mais comme de toutes façons il faut SET juste après le nom de la première table c'est mort.
Allez zou j'vais coder tout ça :D


---------------
Ne vous mariez qu'une fois dans votre vie tellement c'est galère © randolfinette | Quand l'antre grogne, le diable cogne... | Un problème d'acquisition VHS?
Reply

Marsh Posté le 24-01-2005 à 18:26:26    

update table1 set table1 = (select table2.champ where not table1.champ2 is null and table1.champ1 = table2.champ1)
 
Normalement, ça doit marcher par contre ;)

Reply

Marsh Posté le 24-01-2005 à 18:27:16    

Beegee a écrit :

Avec SQL Server Apparemment c'est ok, donc tu confonds peut-être ? :)


oui et non. C'est en cherchant pour SQL Server que j'étais tombé sur une syntaxe pour Oracle. De souvenir, ça avait marché. Mais impossible de me souvenir...

Reply

Marsh Posté le 24-01-2005 à 19:21:48    

Arjuna a écrit :

update table1 set table1 = (select table2.champ where not table1.champ2 is null and table1.champ1 = table2.champ1)
 
Normalement, ça doit marcher par contre ;)


Nan marche pas non plus :d


---------------
Ne vous mariez qu'une fois dans votre vie tellement c'est galère © randolfinette | Quand l'antre grogne, le diable cogne... | Un problème d'acquisition VHS?
Reply

Marsh Posté le 24-01-2005 à 19:49:37    

bon, déjà, quand ça marche pas, dit quelle est l'erreur, parceque cette syntaxe ne peut QUE marcher, à moins que la sous-requête retourne des doublons normalement, ou que certaines lignes ne participent pas à la jointure (à ce moment, il faut ajouter quasiement la même sous-requête dans ma clause WHERE du update.

Reply

Marsh Posté le 24-01-2005 à 19:56:41    

update table1 set table1.champ1 = (select table2.champ where table1.champ2 is not null and table1.champ1 = table2.champ1)


Message édité par Beegee le 24-01-2005 à 19:57:17
Reply

Marsh Posté le 24-01-2005 à 20:05:54    

Hafrexx a écrit :

Nan marche pas non plus :d


arf, vi, problèmes en recopitant depuis ma tête :D

Reply

Marsh Posté le 24-01-2005 à 20:06:47    

pour le NOT, je suis pas d'accord :
 
"where not table1.champ2 is null" = where table1.champ2 is not null" :p

Reply

Marsh Posté le 24-01-2005 à 20:17:57    

je sais bien mais c'est plus lisible :p

Reply

Marsh Posté le 24-01-2005 à 20:42:03    

ouais mais moi j'ai copité c'est koi qui était écrit dans le post du monsieur moi d'abors :o

Reply

Marsh Posté le 24-01-2005 à 21:28:17    

oh yaisssssse ça marche :love:
Je ne pensais pas que dans une sous requete on pouvait se passer du FROM
 
[:xp1700] :jap:


---------------
Ne vous mariez qu'une fois dans votre vie tellement c'est galère © randolfinette | Quand l'antre grogne, le diable cogne... | Un problème d'acquisition VHS?
Reply

Marsh Posté le 25-01-2005 à 08:09:22    

J'avais même pas vu qu'il manquait ça :D
 
update table1 set table1.champ1 = (select table2.champ from table2 where table1.champ2 is not null and table1.champ1 = table2.champ1)
 
C'est plus lisible quand même :p

Reply

Marsh Posté le 25-01-2005 à 10:07:03    

arf, mon non plus j'avais pas vu :lol:

Reply

Marsh Posté le 25-01-2005 à 12:06:41    

De plus je ne savais pas qu'on pouvait, dans une sous requête, faire référence dans la clause WHERE à une table non explicitée dans le FROM mais définie dans la requête principale :D
 
C'est fou ça non [:ddr555]


---------------
Ne vous mariez qu'une fois dans votre vie tellement c'est galère © randolfinette | Quand l'antre grogne, le diable cogne... | Un problème d'acquisition VHS?
Reply

Marsh Posté le 25-01-2005 à 12:29:34    

ben si, ça c'est justement tout l'intérêt des sous-requêtes : être capable d'inter-agir avec la requête principale.

Reply

Marsh Posté le 25-01-2005 à 14:02:19    

C'est con ça fait 5 ans que je code du SQL et j'étais toujours emmerdé quand je devais faire ce type d'opérations.
 
Bon oserais-je poser une question plus compliquée (je pense) :whistle:
Cette fois c'est plus pour la culture personnelle sur la manière dont Oracle analyse les requêtes :D
Donc ne vous prenez pas la tête dessus, j'ai un jour essayé cette requête, elle prend un temps énorme bien qu'il n'y ait qu'un miliers d'enregistrements dans la base
 

Citation :


select * from DMAPTree where type=1 or type=0 connect by parentid = PRIOR ID start with id in  
((select origindataid from dtree where dataid in  
(select id from dmaptree where type='0' connect by prior id=parentid start with id=1000))
 union  
(select id as origindataid from dmaptree where id=1000)) order by name


 
Alors que d'exécuter  
 

Citation :


((select origindataid from dtree where dataid in (select id from dmaptree where type='0' connect by prior id=parentid start with id=1000))
 union  
(select id as origindataid from dmaptree where id=1000))  


 
Puis d'exécuter
 

Citation :


select * from DMAPTree where type=1 or type=0 connect by parentid = PRIOR ID start with id in (1,2,3,4) order by name


 
Est d'une vitesse normale.
 
Ce qui signifie qu'Oracle ne commence pas par exécuter la sous-requête puis réinjecter le résultat dans la requête principale. Du coup il doit y avoir moyen de l'optimiser, mais là je ne sais plus comment puisque ma logique de calcul d'Oracle n'est pas pareil que la mienne [:ddr555]


---------------
Ne vous mariez qu'une fois dans votre vie tellement c'est galère © randolfinette | Quand l'antre grogne, le diable cogne... | Un problème d'acquisition VHS?
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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