[SQL][ORACLE] update multi table

salut,
j’aimerais faire un update multi table sous Oracle. J’ai donc essayé un truc du genre:

qui marche sous SQL Server mais pas sous Oracle.
Quelle est donc la bonne syntaxe?

solution

autant je comprends comment ca fonctionne sous oracle, autant la syntaxe de SQLserver me laisse perplexe (je comprends pas comment ca fonctionne la… il est ou l’update de t1_fax2 ?). En plus je vois pas ou est l’update multi table (j’ai jamais fait, pour ca que ca m’interesse), pour moi la tu n’update que t1 (en assumant que t1_* correspondent aux data de T1). J’ai faux?

Quand il parlait d’update multi-table, à la vue de son exemple, il parlait en nombre de tables en source, pas en nombre de tables mises à jour. J’en profite pour dire que l’ajout d’une clause WHERE à l’extérieur est quelque fois nécessaire; ceci pour ne pas se retrouver à mettre à null toutes lignes ne correspondant pas à la sous-requête, en effet si la clause WHERE de la sous-requête ne ramène aucune occurence, aucune instruction n’interdit que l’update ne se fasse sur rien c’est à dire prendre une valeur nulle. Sous oracle donc:

UPDATE t1 SET (t1_fax,t1_fax2) = (SELECT t2_fax,t2_fax2 FROM t2 WHERE t1.t1_pk=t2_pk) WHERE t1_pk in (SELECT t2_pk FROM t2 ) /edit: Je trouve l’UPDATE sous SQL server plus souple pour certains cas pour les clauses FROM et JOIN, il y a notamment moins besoin de sous-requête. Par contre sous SQL Server il n’y a pas de UPDATE SET sur des n-upplets. Note: Je n’ai pas de préference ni pour Oracle ni pour SQL server. edit/

Pour ta question, je ne me souviens pas avoir eu besoin de mise à jour simultanées de tables en directe en SQL. Par contre au travers de vue ou de datasets j’ai eu le cas: il faut principalement qu’il y ait bien une colonne d’unicité pour chaque table mise à jour . voir cet article Oracle 10g Tutorials- Updating Views. Cet article doit rester valable dans son esprit pour les datasets et les UPDATE en SQL en direct.

extraits en particulier [quote]The rules for updatable join views are as follows. Views that meet this criteria are said to be inherently updatable.
Rule : Description

General Rule : Any INSERT, UPDATE, or DELETE operation on a join view can modify only one underlying base table at a time.

UPDATE Rule : All updatable columns of a join view must map to columns of a key-preserved table. If the view is defined with the WITH CHECK OPTION clause, then all join columns and all columns of repeated tables are not updatable.

DELETE Rule : Rows from a join view can be deleted as long as there is exactly one key-preserved table in the join. If the view is defined with the WITH CHECK OPTION clause and the key preserved table is repeated, then the rows cannot be deleted from the view.

INSERT Rule: An INSERT statement must not explicitly or implicitly refer to the columns of a non-key-preserved table. If the join view is defined with the WITH CHECK OPTION clause, INSERT statements are not permitted.[/quote]

J’ai juste ajouté l’exemple du fax2 dans la requête Oracle pour montrer un update sur plusieurs champs.
Mais les syntaxes sont correctes.