No he visto un nombre formal para esto. El Oracle SQL Reference solo se refiere a la actualización de una subconsulta. Tiendo a pensar en ello como una forma de "ver la actualización", con la subconsulta en la vista en línea.
Sí, funciona cuando se unen varias tablas, pero está sujeto a la actualización de las reglas de visualización. Esto significa que solo se puede actualizar una de las tablas base de la vista, y esta tabla debe conservarse "clave" en la vista: es decir, sus filas solo deberían poder aparecer una vez en la vista. Esto requiere que cualquier otra tabla en la vista (subconsulta) se haga referencia a través de restricciones de clave externa en la tabla que se actualizará.
Algunos ejemplos pueden ayudar. Uso de las tablas estándares de Oracle EMP y DEPT, con EMP.EMPNO definido como la clave principal de EMP, y EMP.DEPTNO definido como una clave externa para DEPT.DEPTNO, a continuación, se permite que esta actualización
update (select emp.empno, emp.ename, emp.sal, dept.dname
from emp join dept on dept.deptno = emp.deptno
)
set sal = sal+100;
Pero esto no es:
-- DEPT is not "key-preserved" - same DEPT row may appear
-- several times in view
update (select emp.ename, emp.sal, dept.deptno, dept.dname
from emp join dept on dept.deptno = emp.deptno
)
set dname = upper(dname);
En cuanto a rendimiento: el optimizador (debe) identificar la tabla base que se actualiza durante el análisis, y se une a otra tabla será ignorado, ya que no tienen ninguna relación con la actualización que se realiza - como esta AUTOTRACE salida muestra:
SQL> update (select emp.ename, emp.sal, dept.dname
2 from emp join dept on dept.deptno = emp.deptno
3 )
4 set sal = sal-1;
33 rows updated.
Execution Plan
----------------------------------------------------------
Plan hash value: 1507993178
------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 33 | 495 | 3 (0)| 00:00:01 |
| 1 | UPDATE | EMP | | | | |
| 2 | NESTED LOOPS | | 33 | 495 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| EMP | 33 | 396 | 3 (0)| 00:00:01 |
|* 4 | INDEX UNIQUE SCAN| SYS_C0010666 | 1 | 3 | 0 (0)| 00:00:01 |
------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
4 - access("EMP"."DEPTNO"="DEPT"."DEPTNO")
(Tenga en cuenta que la tabla DEPT Nunca se accede a pesar de que appe DEPT.DNAME ars en la subconsulta).
Hay un ejemplo de una actualización de una unión en otro SO: http://stackoverflow.com/questions/975315/what-is-wrong-with-my-update-statement-with-a-join-in- oracle/975674 # 975674 - Con respecto a la eficiencia: es probablemente la forma más eficiente de actualizar un conjunto de filas –
Generalmente se llama actualización de vista. –