Bonjour,

Je travaille sous Oracle 10.1.0.5.0

J'ai une table "pro" dont la clé est "codsoc, codpro".
J'ai une seconde table "prm" dont la clé est "codsoc, codpro, codlan".

J'ai modifié en masse la table "prm". J'ai modifié ces champs "datmod et utimod" avec la date du jour et mon nom afin d'avoir une trace de qui a modifié ces libellés de produits.

Maintenant, je désire mettre à jour la table "pro" avec le même datmod et utimod pour toutes les lignes que j'ai modifié dans "prm" (en reprenant la liaison sur codsoc, codpro).

Voici la requête que j'ai écrit (qui fonctionne) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
update pro
set (datmod, utimod) = 
(
   select prm.datmod, prm.utimod
   from prm
   where prm.codsoc = 100
   and prm.codlan = 'ITA'
   and prm.tradesig4 = 'IVA21'
   and prm.codpro = pro.codpro
)
where (codsoc, codpro) in 
(
   select prm.codsoc, prm.codpro 
   from prm
   where prm.codsoc = 100
   and prm.codlan = 'ITA'
   and prm.tradesig4 = 'IVA21'
);
(codsoc = 100, codlan = 'ITA' et prm.tradesig4 = 'IVA21' permettant de retrouver les lignes que j'ai modifié).

Comme on voit, on retrouve deux fois plus ou moins la même sous-requête. Outre le problème de performances, cette écriture est particulièrement crade.

Existe-t-il une syntaxe plus propre ?

SQL Server permet notamment les jointures sur les update, ce qui rend l'écriture de telles requêtes de mise à jour plus simple.