2012-12-27 32 views
5

मैं एक पेड़ में एक कॉलम अपडेट करना चाहता हूं। मैं निम्नलिखित बयान के साथ आया था:एसक्यूएल सर्वर: एक पेड़ में कॉलम अपडेट करें

WITH q AS (
    SELECT t1.* 
    FROM buss_item t1 
    WHERE t1.id_item = 218 

    UNION ALL 

    SELECT t2.* 
    FROM buss_item t2 
    JOIN q ON t2.parent_id = q.id_item 
) 
UPDATE q 
SET default_item = 0 

लेकिन मैं कोई त्रुटि मिलती है:

Derived table 'q' is not updatable because a column of the derived table is derived or constant.

कैसे इस अद्यतन को ठीक करने पर कोई विचार?

उत्तर

7
WITH q AS (
    SELECT t1.* 
    FROM buss_item t1 
    WHERE t1.id_item = 218 

    UNION ALL 

    SELECT t2.* 
    FROM buss_item t2 
    JOIN q ON t2.parent_id = q.id_item 
) 
UPDATE buss_item set default_item = 0 from q 
where q.item_ID=buss_item.ItemID 
+2

यह एक आकर्षण की तरह काम करता है। बहुत बहुत धन्यवाद। –

2

आप CTE अद्यतन नहीं कर सकते, तो आप शायद एक CTE के परिणामों के अनुसार buss_item तालिका अद्यतन करने की आवश्यकता है, इस प्रयास करें:

WITH q AS (
    SELECT t1.* 
    FROM buss_item t1 
    WHERE t1.id_item = 218 

    UNION ALL 

    SELECT t2.* 
    FROM buss_item t2 
    JOIN q ON t2.parent_id = q.id_item 
) 

UPDATE bi 
SET  default_item = 0 
FROM buss_item bi 
JOIN q ON q.id_item = bi.id_item 
1

आप CTE अद्यतन कर सकते हैं, और यह बहुत ही उपयोगी उन्नत सुविधा है टी-एसक्यूएल का। असल में आप निश्चित रूप से सीटीई अपडेट नहीं कर रहे हैं, लेकिन तालिकाएं इसकी परिभाषा में शामिल हैं और आप इसे एक ही चरण में कर रहे हैं, जब मुझे यह पता चला तो मुझे आश्चर्य हुआ :) !! शास्त्रीय व्युत्पन्न तालिकाओं के साथ ही किया जा सकता है। आप कई घोंसले भी कर सकते हैं और अभी भी परिभाषा के पहले स्तर में शामिल वास्तविक तालिकाओं के अपडेट कर सकते हैं। आप रैंकिंग कार्यों का उपयोग करने जैसे घोंसला स्तरों के बीच अतिरिक्त तर्क का भी उपयोग कर सकते हैं।

यहां रिपोर्ट की गई त्रुटि यूनियन स्टेटमेंट की वजह से है, इस तरह के ऑपरेशन करते समय इसकी अनुमति नहीं है, इसके बिना अपडेट सफल होगा।