2011-03-21 17 views
35

के साथ उपयोग करके अद्यतन कथन मेरे पास एक स्क्रिप्ट है जो कुछ परिणामों के साथ आने के लिए क्लॉज के ढेर का उपयोग करती है, और फिर मैं उस परिणाम को एक तालिका में लिखना चाहता हूं। मैं बस इसके चारों ओर अपना सिर नहीं ले सकता, क्या कोई मुझे सही दिशा में इंगित कर सकता है?क्लॉज

यहाँ एक सरल उदाहरण है इंगित करता है कि क्या मैं करना चाहता हूँ:

with comp as (
    select *, 42 as ComputedValue from mytable where id = 1 
) 
update t 
set  SomeColumn = c.ComputedValue 
from mytable t 
     inner join comp c on t.id = c.id 

है काफी खंड है कि सभी एक दूसरे का संदर्भ है, तो किसी भी सुझाव वास्तव में उपयोग करते हुए खंड के साथ अत्यधिक पसंद किया जाएगा के साथ कुछ असली बात नेस्टेड सबक्वायरीज़ में इसे पुन: सक्रिय करने पर।

अग्रिम धन्यवाद,

गर्ट-जन

+2

FYI करें: आप का कहना है कि आप इसे अपने जवाब अपने शीर्षक और प्रश्न संपादित करने के लिए नहीं है। बस अपना समाधान अपने उत्तर के रूप में जोड़ें और अगर यह सबसे अच्छा है तो इसे चुनें। –

+0

ठीक है, इसे अभी तक उत्तर के रूप में चिह्नित नहीं किया जा सकता है। धन्यवाद! – gjvdkamp

+0

मैं भी एक प्रतिक्रिया खोज रहा था और मैंने इसे यहां पाया: http://stackoverflow.com/questions/7030699/oracle-sql-update-with-data-from-another-table – Bogdan

उत्तर

36

यदि कोई मेरे यहां यहां आता है, तो यही वह जवाब है जो मेरे लिए काम करता है।

update mytable t 
set z = (
    with comp as (
    select b.*, 42 as computed 
    from mytable t 
    where bs_id = 1 
) 
    select c.computed 
    from comp c 
    where c.id = t.id 
) 

गुड लक,

जी जे

+3

क्या यह सभी पंक्तियों को अपडेट नहीं करेगा? यदि ऐसी पंक्तियां हैं जहां c.id <> t.id है, तो क्या वे शून्य पर सेट नहीं होंगे? क्या कोई भी उस जगह को कहने के लिए जानता है जहां बाहर भी खंड है? –

+0

अब ओरेकल का उपयोग न करें और यह थोड़ी देर पहले था। इसे आज़माएं और हमें बताएं ;-) आईआईआरसी ने यह मेरे लिए काम किया। – gjvdkamp

+0

@gjvdkamp यह संजय नंबियार की तरह काम करता है: अद्यतन चयनित पंक्तियों पर काम करता है, लेकिन "अन्य" से बाहर की सभी अन्य पंक्तियां शून्य पर सेट की जाती हैं। [2] क्या कोई भी कहां से बाहर निकलने का तरीका जानता है? – robsonrosa

24

वाक्य रचना के साथ एक इनलाइन दृश्य में मान्य प्रतीत होता है, उदा

UPDATE (WITH comp AS ... 
     SELECT SomeColumn, ComputedValue FROM t INNER JOIN comp ...) 
    SET SomeColumn=ComputedValue; 

लेकिन त्वरित परीक्षण मैं इस हमेशा ORA-01732: data manipulation operation not legal on this view के साथ विफल किया है, हालांकि यह सफल रहा है, तो मैं खंड के साथ समाप्त करने के लिए दुबारा लिखा। तो रिफैक्टरिंग कुंजी संरक्षण की गारंटी देने के लिए ओरेकल की क्षमता में हस्तक्षेप कर सकती है।

हालांकि, आप एक मेर्ज का उपयोग करने में सक्षम होना चाहिए। सरल उदाहरण आप इस पोस्ट किया है का उपयोग करते हुए भी खंड के साथ एक की आवश्यकता नहीं है:

MERGE INTO mytable t 
USING (select *, 42 as ComputedValue from mytable where id = 1) comp 
ON (t.id = comp.id) 
WHEN MATCHED THEN UPDATE SET SomeColumn=ComputedValue; 

लेकिन मैं समझता हूँ कि आप एक अधिक जटिल सबक्वेरी आप को अलग करना चाहते हैं। मुझे लगता है कि आप USING क्लॉज मनमाने ढंग से जटिल में सबक्वायरी बनाने में सक्षम होंगे, जिसमें एकाधिक WITH क्लॉज शामिल होंगे।

+1

हाय, आपके प्रयास के लिए बहुत बहुत धन्यवाद, पहले से ही इसे चलाने में कामयाब रहे। मेरे द्वारा उपयोग किए जाने वाले बयान में कुछ स्तर हैं जो औसत और stddevs की गणना करते हैं, फिर यह उपयोग करता है कि अन्य टैबलेट आदि से कोई सामान्य (सांख्यिकीय रूप से) डेटा नहीं है। यह रिफैक्टर के लिए वास्तविक दर्द होगा। उदाहरण सिर्फ अद्यतन वाक्यविन्यास था। – gjvdkamp