Nie widziałem na to oficjalnej nazwy. Oracle SQL Reference odnosi się tylko do aktualizacji podzapytania. Myślę o tym jako o formie „aktualizacji widoku”, przy czym podzapytanie jest w widoku wbudowanym.
Tak, działa, gdy kilka tabel jest połączonych, ale podlega zasadom aktualizacji widoków. Oznacza to, że tylko jedna z tabel podstawowych widoku może zostać zaktualizowana, a ta tabela musi być „zachowana klucza” w widoku, tj. jej wiersze powinny być widoczne tylko raz w widoku. Wymaga to, aby wszelkie inne tabele w widoku (podzapytanie) były przywoływane przez ograniczenia klucza obcego w tabeli, która ma zostać zaktualizowana.
Kilka przykładów może pomóc. Ta aktualizacja jest dozwolona przy użyciu standardowych tabel Oracle EMP i DEPT, przy czym EMP.EMPNO jest zdefiniowany jako klucz podstawowy EMP, a EMP.DEPTNO jest zdefiniowany jako klucz obcy DEPT.DEPTNO:
update (select emp.empno, emp.ename, emp.sal, dept.dname
from emp join dept on dept.deptno = emp.deptno
)
set sal = sal+100;
Ale to nie jest:
-- 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);
Jeśli chodzi o wydajność:optymalizator (musi) zidentyfikować tabelę bazową, która ma zostać zaktualizowana podczas parsowania, a połączenia z inną tabelą zostaną zignorowane, ponieważ nie mają żadnego wpływu na aktualizację, która ma zostać wykonana - jak pokazuje to wyjście AUTOTRACE:
AktualizacjaSQL> 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")
(Zauważ, że tabela DEPT nigdy nie jest dostępna, mimo że DEPT.DNAME pojawia się w podzapytaniu).