2009-06-16 11 views
6

ओरेकल आपको एक SELECT कथन के परिणाम अपडेट करने देता है।एक SELECT स्टेटमेंट के परिणाम अपडेट करें

UPDATE (<SELECT Statement>) 
SET <column_name> = <value> 
WHERE <column_name> <condition> <value>; 

मुझे लगता है कि यह एक और तालिका में मेल खाने वाले पंक्ति के मूल्य पर आधारित एक तालिका में अद्यतन करने के स्तंभों के लिए इस्तेमाल किया जा सकता लगता है।

इस सुविधा को कैसे कहा जाता है, क्या यह कुशलतापूर्वक बड़े अपडेट के लिए उपयोग किया जा सकता है, क्या यह काम करता है जब SELECT कई तालिकाओं में शामिल होता है, और यदि ऐसा है, तो कैसे?

+2

किसी अन्य एसओ में शामिल होने का एक उदाहरण है: http://stackoverflow.com/questions/975315/what-is-wrong-with-my-update-statement-with-a-join-in- ओरेकल/975,674 # 975,674 - दक्षता के संबंध में: यह शायद पंक्तियों –

+1

यह आम तौर पर देखने को अपडेट करने में कहा जाता है का एक सेट को अद्यतन करने के लिए सबसे कारगर तरीका है। –

उत्तर

1

टिप्पणी के लिए धन्यवाद, मुझे लगा कि यह

ओरेकल के लिए आप एक मेज पर एक अद्यतन लिख सकते हैं जहाँ आप एक साथ जानकारी पुनः प्राप्त में शामिल होने गया था मानक Sql ... :(की तरह:

UPDATE (
    SELECT * 
    FROM table1 t1 
    LEFT JOIN table2 t2 ON t2.t1id = t1.ID 
) SET t1.col1 = t2.col2 

के लिए Sql सर्वर, यह है:

UPDATE t1 
SET col1 = t2.col2 
FROM table1 t1 
LEFT JOIN table2 t2 on t2.t1id = t1.id 

किसी को भी इस कि Oracle, Sql सर्वर और MySQL पर काम करता है इसके लिए कोई तरीका जानता है मुझे कोई दिलचस्पी होगी

+1

आप यह सुनिश्चित करें कि काम करता है? ओरेकल में, मैं प्राप्त "ORA-00933: ठीक से समाप्त नहीं एसक्यूएल कमांड" "से" पर? – Thilo

+0

http://www.dpriver.com/pp/sqlformat.htm का उपयोग करते हुए यह MSSQL के लिए काम करने के लिए लगता है, लेकिन ओरेकल, MySQL के लिए वाक्यविन्यास त्रुटियों या डीबी 2 – Thilo

+0

देता -1 कोई यह Oracle में काम नहीं करता। मैं इसे या तो मानक एसक्यूएल है यकीन नहीं है। –

1

आपके द्वारा उल्लिखित रूप में कोई विशिष्ट नाम AFAIK नहीं है। बस एक चयन कथन का परिणाम अपडेट कर रहा है।

एक और रूप (एकल या एकाधिक अद्यतन के साथ) सहसंबद्ध अद्यतन बुलाया

UPDATE TABLE(<SELECT STATEMENT>) <alias> 
SET <column_name> = (
    SELECT <column_name> 
    FROM <table_name> <alias> 
    WHERE <alias.table_name> <condition> <alias.table_name> 
); 

एकाधिक प्रपत्र

... 
SET (<column_name_list>) = (
    SELECT <column_name_list> 
... 

वहाँ भी है एक जहाँ से मूल्यों के लौटने बुलाया अद्यतन नहीं है लौटने वाले खंड

और कुछ विशिष्ट नेस्टेड टेबल के साथ अद्यतन के लिए एस है। बेस्ट कम से कम इस दो पृष्ठों

Oracle® Database SQL Language Reference SELECT

Oracle® Database SQL Language Reference UPDATE

4

मैं इस के लिए एक औपचारिक नाम नहीं देखा है की जाँच करने के लिए है। 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 भूख सबक्वेरी में आर्स)।

संबंधित मुद्दे