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