Oracle
 sql >> Base de données >  >> RDS >> Oracle

UPDATE avec la syntaxe JOIN pour Oracle Database

La syntaxe de l'instruction UPDATE est :

http://docs.oracle.com/cd/B19306_01 /server.102/b14200/statements_10007.htm

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