sql >> Base de Datos >  >> RDS >> Oracle

ACTUALIZAR con sintaxis JOIN para Oracle Database

La sintaxis de la instrucción UPDATE es:

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

donde dml_table_expression_clause es:

Preste atención a ( subquery ) parte de la sintaxis anterior.

La subquery es una característica que permite realizar una actualización de uniones.

En la forma más simple puede ser:

UPDATE (
   subquery-with-a-join
)
SET cola=colb

Antes de actualizar una unión, debe conocer las restricciones enumeradas aquí:

https://docs.oracle.com/cd/B28359_01 /server.111/b28286/statements_8004.htm

  • Un operador de conjuntos
  • UN operador DISTINTO
  • Una función agregada o analítica
  • Cláusula GROUP BY, ORDER BY, MODEL, CONNECT BY o START WITH
  • Una expresión de colección en una lista SELECT
  • Una subconsulta en una lista SELECT
  • Una subconsulta designada CON SOLO LECTURA
  • Se une, con algunas excepciones, como se documenta en la Guía del administrador de la base de datos de Oracle

y también reglas comunes relacionadas con las vistas actualizables, aquí (sección:Updating a Join View ):
http://docs .oracle.com/cd/B19306_01/server.102/b14231/views.htm#sthref3055

Primero podemos crear una subconsulta con una unión:

SELECT age 
FROM ages a
JOIN names m ON a.id = m.id
WHERE m.name = 'Sally'

Esta consulta simplemente devuelve el siguiente resultado:

       AGE
----------
        30

y ahora podemos intentar actualizar nuestra consulta:

UPDATE (
    SELECT age 
    FROM ages a
    JOIN names m ON a.id = m.id
    WHERE m.name = 'Sally'
)
SET age = age + 1;

pero obtenemos un error:

Este error significa que una de las restricciones anteriores no se cumple (tabla de clave preservada).

Sin embargo, si agregamos claves primarias a nuestras tablas:

alter table names add primary key( id );
alter table ages add primary key( id );

entonces ahora la actualización funciona sin ningún error y el resultado final es:

select * from ages;

        ID        AGE
---------- ----------
         1         25
         2         31
         3         35