मैं इस के लिए एक औपचारिक नाम नहीं देखा है की जाँच करने के लिए है। Oracle SQL Reference बस एक सबक्वायरी को अद्यतन करने के लिए संदर्भित करता है। मैं इसे "व्यू अपडेटिंग" के रूप में सोचता हूं, जिसमें सबक्वायरी इन-लाइन व्यू में है।
हां, यह काम करता है जब कई तालिकाओं में शामिल होते हैं, लेकिन अद्यतन अद्यतन के नियमों के अधीन होते हैं। इसका अर्थ यह है कि दृश्य की आधार तालिकाओं में से केवल एक को अपडेट किया जा सकता है, और यह तालिका दृश्य में "कुंजी-संरक्षित" होनी चाहिए: यानी इसकी पंक्तियां केवल एक बार दृश्य में दिखाई देनी चाहिए। इसके लिए आवश्यक है कि दृश्य में किसी अन्य तालिका को तालिका में विदेशी कुंजी बाधाओं के माध्यम से संदर्भित किया जा सके (subquery) को संदर्भित किया जाए।
कुछ उदाहरण मदद कर सकते हैं। मानक ओरेकल ईएमपी और डीईपीटी टेबल का उपयोग करना, EMP.EMPNO को EMP की प्राथमिक कुंजी के रूप में परिभाषित किया जा रहा है, और EMP.DEPTNO को डीईपीटी के लिए विदेशी कुंजी के रूप में परिभाषित किया जा रहा है।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);
प्रदर्शन के लिए के रूप में: अनुकूलक आधार तालिका की पहचान (चाहिए) होगा पार्स करने के दौरान अद्यतन किया जाना है, और करने के लिए मिलती है क्योंकि वे किसी भी असर पर अद्यतन किया जाने की जरूरत नहीं है अन्य तालिका नजरअंदाज कर दिया जाएगा - इस 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")
(ध्यान दें कि तालिका विभाग भले ही कभी नहीं पहुँचा जा सकता है DEPT.DNAME भूख सबक्वेरी में आर्स)।
किसी अन्य एसओ में शामिल होने का एक उदाहरण है: http://stackoverflow.com/questions/975315/what-is-wrong-with-my-update-statement-with-a-join-in- ओरेकल/975,674 # 975,674 - दक्षता के संबंध में: यह शायद पंक्तियों –
यह आम तौर पर देखने को अपडेट करने में कहा जाता है का एक सेट को अद्यतन करने के लिए सबसे कारगर तरीका है। –