Bonjour,

J'ai le problème habituel lorsqu'on désire mettre à jour un jeu de lignes d'une table dont la sélection et les valeurs à mettre à jour dépendent d'une jointure avec une autre table.

Avec d'autres SGBD, on utilisera la clause "FROM" du UPDATE, ou "INNER JOIN".
Mais Oracle ne semble toujours pas supporter ce genre de requête.

J'ai trouvé en lieu et place, sur le lien ci-dessous qu'on pouvait mettre à jour le résultat d'un sous-select.
Seulement, dans mon cas, le sous-select contient une jointure, et c'est le drame.
http://geekswithblogs.net/WillSmith/...oin-again.aspx

Ma requête :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
update 
(
  select eve.codsoc, eve.achvte, eve.typeve, eve.numeve, eve.utimod, eve.datmod, eve.dateve, jnl.datecr
  from eve
  inner join jnl on jnl.codsoc = eve.codsoc and jnl.achvte = eve.achvte and jnl.typeve = eve.typeve and jnl.numeve = eve.numeve and jnl.typecr = 'CLI'
) t
set t.utimod = 'DES', t.datmod = to_char(sysdate, 'YYYYMMDD'), t.dateve = t.datecr
where t.codsoc = 100 and t.achvte = 'V' and t.typeve = 'FAC' and t.dateve <> t.datecr;

L'erreur :
Erreur à la ligne de commande : 7, colonne : 4
Rapport d'erreur :
Erreur SQL : ORA-01779: cannot modify a column which maps to a non key-preserved table
01779. 00000 - "cannot modify a column which maps to a non key-preserved table"
*Cause: An attempt was made to insert or update columns of a join view which
map to a non-key-preserved table.
*Action: Modify the underlying base tables directly.
Ce que je cherche à faire :

Dans la table EVE, je souhaite mettre à jour la colonne DATEVE avec la valeur DATECR de la table JNL pour toutes les lignes qui respectent la jointure sur CODSOC/ACHVTE/TYPEVE/NUMEVE et un filtre sur JNL.TYPECR = 'CLI', pour lesquelles les deux dates sont différentes.

Comment faire ?

J'ai bien la solution de faire deux fois la même sous-requête (une fois pour récupérer la date à mettre à jour, et une fois pour le filtre), mais niveau maintenance, ça va être la tannée...

Oracle 11gR2