non ho visto un nome formale per questo. Lo Oracle SQL Reference si riferisce semplicemente all'aggiornamento di una sottoquery. Tendo a considerarlo come una forma di "aggiornamento della vista", con la sottoquery in visualizzazione in linea.
Sì, funziona quando un numero di tabelle viene unito, ma soggetto all'aggiornamento delle regole di visualizzazione. Ciò significa che solo una delle tabelle di base della vista può essere aggiornata e questa tabella deve essere "salvata con la chiave" nella vista: vale a dire che le sue righe dovrebbero essere visualizzate una sola volta nella vista. Ciò richiede che qualsiasi altra tabella nella vista (sottoquery) sia referenziata tramite vincoli di chiave esterna sulla tabella da aggiornare.
Alcuni esempi possono essere d'aiuto. Utilizzo delle tabelle Oracle EMP e DEPT standard, con EMP.EMPNO definito come chiave primaria di EMP e EMP.DEPTNO definito come chiave esterna da DEPT.DEPTNO, allora questo aggiornamento è consentito:
update (select emp.empno, emp.ename, emp.sal, dept.dname
from emp join dept on dept.deptno = emp.deptno
)
set sal = sal+100;
Ma non è questo:
-- 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);
quanto riguarda le prestazioni: l'ottimizzatore sarà (deve) identificare la tabella di base da aggiornare durante l'analisi, e si unisce a altro tavolo viene ignorato dal momento che non hanno alcuna influenza sulla aggiornamento da eseguire - come dimostra questo uscita Autotrace:
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")
(si noti che non è mai tabella DEPT accede anche se DEPT.DNAME appe ars nella sottoquery).
fonte
2009-06-16 09:16:40
C'è un exemple un aggiornamento di un join in un altro SO: http://stackoverflow.com/questions/975315/what-is-wrong-with-my-update-statement-with-a-join-in- oracle/975.674 # 975.674 - Per quanto riguarda l'efficienza: è probabilmente il modo più efficiente di aggiornare un insieme di righe –
E 'generalmente chiamato vista l'aggiornamento. –