nie widziałem formalną nazwę dla tego produktu. Oracle SQL Reference odnosi się tylko do aktualizacji podkwerendy. Mam tendencję do myślenia o tym jako o "aktualizacji widoku", z podzapytaniem w widoku liniowym.
Tak, działa po połączeniu wielu tabel, ale z zastrzeżeniem reguł aktualizacji widoku. Oznacza to, że tylko jedna z tabel podstawowych widoku może być aktualizowana, a ta tabela musi być "zachowana na klucz" w widoku: tzn. Jej wiersze powinny być wyświetlane tylko raz w widoku. Wymaga to, aby wszelkie inne tabele w widoku (podzapytanie) były przywoływane przez ograniczenia klucza obcego w tabeli, które mają być aktualizowane.
Niektóre przykłady mogą pomóc. Korzystanie ze standardowych tabel Oracle EMP i DEPT, przy czym EMP.EMPNO jest zdefiniowany jako klucz podstawowy EMP, a EMP.DEPTNO jest zdefiniowany jako klucz obcy dla DEPT.DEPTNO, to zmiana jest dozwolona:
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);
chodzi o wydajność: Optymalizator będzie (musi) identyfikować tabelę podstawową być aktualizowane podczas parsowania, i dołącza do druga tabela zostanie zignorowany, ponieważ nie mają one żadnego wpływu na aktualizację do wykonania - jak tego AUTOTRACE pokazy wyjściowych:
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")
(Zauważ, że tabela DEPT nigdy nie jest dostępny, chociaż DEPT.DNAME appe ars w podzapytaniu).
Istnieje przykład aktualizacji połączenia w innym języku SO: http://stackoverflow.com/questions/975315/what-is-wrong-with-my-update-statement-with-a-join-in- oracle/975674 # 975674 - Dotyczące wydajności: jest to prawdopodobnie najbardziej efektywny sposób aktualizowania zestawu wierszy. –
Na ogół nazywa się aktualizację widoku. –