Neviděl jsem pro to formální název. Referenční příručka Oracle SQL pouze odkazuje na aktualizaci poddotazu. Mám tendenci to považovat za formu "aktualizace pohledu", přičemž dílčí dotaz je v in-line zobrazení.
Ano, funguje to, když je spojeno několik tabulek, ale podléhá aktualizaci pravidel zobrazení. To znamená, že lze aktualizovat pouze jednu ze základních tabulek pohledu a tato tabulka musí být v pohledu „zachována jako klíč“:tj. její řádky by se měly v pohledu zobrazit pouze jednou. To vyžaduje, aby se na všechny ostatní tabulky v pohledu (poddotazu) odkazovalo prostřednictvím omezení cizího klíče v tabulce, která má být aktualizována.
Některé příklady mohou pomoci. Pomocí standardních tabulek Oracle EMP a DEPT, kdy EMP.EMPNO je definován jako primární klíč EMP a EMP.DEPTNO je definován jako cizí klíč DEPT.DEPTNO, je tato aktualizace povolena:
update (select emp.empno, emp.ename, emp.sal, dept.dname
from emp join dept on dept.deptno = emp.deptno
)
set sal = sal+100;
Ale tohle není:
-- 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);
Pokud jde o výkon:optimalizátor (musí) identifikovat základní tabulku, která má být aktualizována během analýzy, a spojení s jinou tabulkou budou ignorována, protože nemají žádný vliv na aktualizaci, která má být provedena - jak ukazuje tento výstup AUTOTRACE:
AktualizaceSQL> 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")
(Všimněte si, že tabulka DEPT není nikdy přístupná, i když se v dílčím dotazu objeví DEPT.DNAME).