मैंने इसके लिए औपचारिक नाम नहीं देखा है। Oracle SQL Reference बस एक सबक्वायरी को अपडेट करने के लिए संदर्भित करता है। मैं इसे "व्यू अपडेटिंग" के रूप में देखता हूं, जिसमें सबक्वायरी इन-लाइन व्यू में है।
हां, यह तब काम करता है जब कई तालिकाओं को जोड़ा जाता है, लेकिन अद्यतन करने के नियमों के अधीन। इसका मतलब है कि केवल एक दृश्य की आधार तालिका को अद्यतन किया जा सकता है, और यह तालिका दृश्य में "कुंजी-संरक्षित" होनी चाहिए:अर्थात इसकी पंक्तियाँ केवल एक बार दृश्य में दिखाई देने में सक्षम होनी चाहिए। इसके लिए यह आवश्यक है कि दृश्य (सबक्वेरी) में किसी भी अन्य तालिका को अद्यतन करने के लिए तालिका पर विदेशी कुंजी बाधाओं के माध्यम से संदर्भित किया जाए।
कुछ उदाहरण मदद कर सकते हैं। मानक Oracle EMP और DEPT तालिकाओं का उपयोग करते हुए, EMP.EMPNO को EMP की प्राथमिक कुंजी के रूप में परिभाषित किया जा रहा है, और EMP.DEPTNO को 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;
लेकिन यह नहीं है:
-- 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);
प्रदर्शन के लिए:ऑप्टिमाइज़र पार्सिंग के दौरान अद्यतन की जाने वाली आधार तालिका की पहचान करेगा (चाहिए), और अन्य तालिका में शामिल होने पर ध्यान नहीं दिया जाएगा क्योंकि उनका प्रदर्शन किए जाने वाले अद्यतन पर कोई असर नहीं पड़ता है - जैसा कि यह ऑटोट्रेस आउटपुट दिखाता है:पी>
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")
(ध्यान दें कि DEPT.DNAME सबक्वेरी में दिखाई देने के बावजूद तालिका DEPT तक कभी नहीं पहुँचा जाता है)।