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

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  SQL - update dans plusieurs fichiers

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

SQL - update dans plusieurs fichiers

n°354345
maxwell01
Posté le 07-04-2003 à 09:44:59  profilanswer
 

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:

mood
Publicité
Posté le 07-04-2003 à 09:44:59  profilanswer
 

n°354350
urd-sama
waste of space
Posté le 07-04-2003 à 09:49:46  profilanswer
 

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 :.
n°354355
maxwell01
Posté le 07-04-2003 à 09:54:08  profilanswer
 

y aurait pas un moyen?

n°354357
urd-sama
waste of space
Posté le 07-04-2003 à 09:55:20  profilanswer
 

faire 2 requêtes  [:spamafote]


---------------
.: Clône de Drasche .:. Ebichuleys .:. Avec l'Aloe Vera je fais de beaux cacas [:dawa] .: www.oserselancer.com :.
n°354358
MagicBuzz
Posté le 07-04-2003 à 09:55:51  profilanswer
 

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

n°354360
urd-sama
waste of space
Posté le 07-04-2003 à 09:58:46  profilanswer
 

j'aurai appris qqch, merci  :jap:


---------------
.: Clône de Drasche .:. Ebichuleys .:. Avec l'Aloe Vera je fais de beaux cacas [:dawa] .: www.oserselancer.com :.
n°354363
MagicBuzz
Posté le 07-04-2003 à 10:01:30  profilanswer
 

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

n°354434
maxwell01
Posté le 07-04-2003 à 11:19:03  profilanswer
 

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

n°354462
MagicBuzz
Posté le 07-04-2003 à 11:44:34  profilanswer
 

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

n°355485
maxwell01
Posté le 08-04-2003 à 10:28:49  profilanswer
 

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.

mood
Publicité
Posté le 08-04-2003 à 10:28:49  profilanswer
 

n°355523
MagicBuzz
Posté le 08-04-2003 à 11:14:05  profilanswer
 

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.

n°355584
maxwell01
Posté le 08-04-2003 à 12:01:47  profilanswer
 

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

n°355912
MagicBuzz
Posté le 08-04-2003 à 16:42:42  profilanswer
 

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.

n°355913
MagicBuzz
Posté le 08-04-2003 à 16:43:32  profilanswer
 

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.

n°960577
Hafrexx
L'antre du diable
Posté le 24-01-2005 à 12:02:52  profilanswer
 

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?
n°960592
Arjuna
Aircraft Ident.: F-MBSD
Posté le 24-01-2005 à 12:19:24  profilanswer
 

chais pas. quelle version d'Oracle ?

n°960594
Arjuna
Aircraft Ident.: F-MBSD
Posté le 24-01-2005 à 12:19:41  profilanswer
 

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

n°960604
Hafrexx
L'antre du diable
Posté le 24-01-2005 à 12:24:10  profilanswer
 

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?
n°960703
Arjuna
Aircraft Ident.: F-MBSD
Posté le 24-01-2005 à 14:07:09  profilanswer
 

bah ça devrait marcher...

n°960864
Hafrexx
L'antre du diable
Posté le 24-01-2005 à 16:28:38  profilanswer
 

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?
n°960866
Arjuna
Aircraft Ident.: F-MBSD
Posté le 24-01-2005 à 16:30:08  profilanswer
 

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 ;)

n°960887
Beegee
Posté le 24-01-2005 à 16:53:28  profilanswer
 

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
n°960927
Arjuna
Aircraft Ident.: F-MBSD
Posté le 24-01-2005 à 17:50:42  profilanswer
 

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

n°960937
Beegee
Posté le 24-01-2005 à 17:56:15  profilanswer
 

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

n°960943
Hafrexx
L'antre du diable
Posté le 24-01-2005 à 18:09:09  profilanswer
 

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?
n°960971
Arjuna
Aircraft Ident.: F-MBSD
Posté le 24-01-2005 à 18:26:26  profilanswer
 

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

n°960974
Arjuna
Aircraft Ident.: F-MBSD
Posté le 24-01-2005 à 18:27:16  profilanswer
 

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

n°961036
Hafrexx
L'antre du diable
Posté le 24-01-2005 à 19:21:48  profilanswer
 

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?
n°961059
Arjuna
Aircraft Ident.: F-MBSD
Posté le 24-01-2005 à 19:49:37  profilanswer
 

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.

n°961068
Beegee
Posté le 24-01-2005 à 19:56:41  profilanswer
 

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
n°961085
Arjuna
Aircraft Ident.: F-MBSD
Posté le 24-01-2005 à 20:05:54  profilanswer
 

Hafrexx a écrit :

Nan marche pas non plus :d


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

n°961088
Arjuna
Aircraft Ident.: F-MBSD
Posté le 24-01-2005 à 20:06:47  profilanswer
 

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

n°961124
Beegee
Posté le 24-01-2005 à 20:17:57  profilanswer
 

je sais bien mais c'est plus lisible :p

n°961197
Arjuna
Aircraft Ident.: F-MBSD
Posté le 24-01-2005 à 20:42:03  profilanswer
 

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

n°961288
Hafrexx
L'antre du diable
Posté le 24-01-2005 à 21:28:17  profilanswer
 

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?
n°961529
Beegee
Posté le 25-01-2005 à 08:09:22  profilanswer
 

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

n°961616
Arjuna
Aircraft Ident.: F-MBSD
Posté le 25-01-2005 à 10:07:03  profilanswer
 

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

n°961749
Hafrexx
L'antre du diable
Posté le 25-01-2005 à 12:06:41  profilanswer
 

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?
n°961785
Arjuna
Aircraft Ident.: F-MBSD
Posté le 25-01-2005 à 12:29:34  profilanswer
 

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.

n°961876
Hafrexx
L'antre du diable
Posté le 25-01-2005 à 14:02:19  profilanswer
 

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?
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

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

  SQL - update dans plusieurs fichiers

 

Sujets relatifs
[C] lecture fichiers / calcul / reecriture[PERL] Problême de data sharing entre plusieurs threads...
SQL Server : récupérer les enregistrements n à m, problème[PHP]zip de fichiers
Supprimer plusieurs caractères dans une chaine ?[Java + Linux] Il me manque des fichiers :(
[PHP] SQL !!comment faire plusieurs additions a la fois ?
[ACCESS] Importer dans une base les données de plusieurs bases AccessSQL serv - reconnaitre une clé primaire
Plus de sujets relatifs à : SQL - update dans plusieurs fichiers


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