La syntaxe de l'instruction UPDATE est :
http://docs.oracle.com/cd/B19306_01 /server.102/b14200/statements_10007.htm
où dml_table_expression_clause
est :
Veuillez prêter attention à ( subquery )
partie de la syntaxe ci-dessus.
La subquery
est une fonctionnalité qui permet d'effectuer une mise à jour des jointures.
Dans la forme la plus simple, cela peut être :
UPDATE (
subquery-with-a-join
)
SET cola=colb
Avant de mettre à jour une jointure, vous devez connaître les restrictions répertoriées ici :
https://docs.oracle.com/cd/B28359_01 /server.111/b28286/statements_8004.htm
- Un opérateur d'ensemble
- Un opérateur DISTINCT
- Une fonction agrégée ou analytique
- Une clause GROUP BY, ORDER BY, MODEL, CONNECT BY ou START WITH
- Une expression de collection dans une liste SELECT
- Une sous-requête dans une liste SELECT
- Une sous-requête désignée AVEC LECTURE SEULE
- Joints, à quelques exceptions près, comme documenté dans le guide de l'administrateur de la base de données Oracle
ainsi que des règles communes liées aux vues pouvant être mises à jour - ici (section :Updating a Join View
):
http://docs .oracle.com/cd/B19306_01/server.102/b14231/views.htm#sthref3055
Nous pouvons d'abord créer une sous-requête avec une jointure :
SELECT age
FROM ages a
JOIN names m ON a.id = m.id
WHERE m.name = 'Sally'
Cette requête renvoie simplement le résultat suivant :
AGE
----------
30
et maintenant nous pouvons essayer de mettre à jour notre requête :
UPDATE (
SELECT age
FROM ages a
JOIN names m ON a.id = m.id
WHERE m.name = 'Sally'
)
SET age = age + 1;
mais nous obtenons une erreur :
Cette erreur signifie que l'une des restrictions ci-dessus n'est pas respectée (table à clé préservée).
Cependant si nous ajoutons des clés primaires à nos tables :
alter table names add primary key( id );
alter table ages add primary key( id );
alors maintenant la mise à jour fonctionne sans aucune erreur et le résultat final est :
select * from ages;
ID AGE
---------- ----------
1 25
2 31
3 35