SQL अद्यतन क्वेरी में कार्य को अलग करें?


98

मैं एक तालिका में मान को दूसरी तालिका में मानों के योग में सेट करने का प्रयास कर रहा हूं। इन पंक्तियों के साथ कुछ:

UPDATE table1
SET field1 = SUM(table2.field2)
FROM table1
INNER JOIN table2 ON table1.field3 = table2.field3
GROUP BY table1.field3

बेशक, जैसा कि यह खड़ा है, यह काम नहीं करेगा - SETसमर्थन नहीं करता है SUMऔर यह समर्थन नहीं करता है GROUP BY

मुझे यह पता होना चाहिए, लेकिन मेरे दिमाग का चित्र एक रिक्त है। मैं क्या गलत कर रहा हूं?


महान सवाल ... काश मैं एक से अधिक बार उत्थान कर पाता।
जो

जवाबों:


148
UPDATE t1
SET t1.field1 = t2.field2Sum
FROM table1 t1
INNER JOIN (select field3, sum(field2) as field2Sum
   from table2
  group by field3) as t2
on t2.field3 = t1.field3  

40
मैंने तीन प्रश्नों को एक साथ रखा और एक निष्पादन योजना चलाई। इस जवाब में 5% की लागत थी।
मार्गरेट

सुरुचिपूर्ण, लागू करने में आसान ... आप पूरे दिन कहां रहे ??? मैं अब एक घंटे से अधिक समय तक इस पर अपना सिर
पीटता रहा हूं

1
महत्वपूर्ण: यदि आपके द्वारा समूहीकृत किए जा रहे फ़ील्ड में से कोई भी अशक्त हो सकता है (जैसे फ़ील्ड 3 ऊपर) देखें। आपको इसके लिए 'ज्वाइन' को संशोधित करने की आवश्यकता होगी या आपकी रकम गलत होगी ( stackoverflow.com/a/14366034/16940 )
सिमोन_विवर

10

उपयोग:

UPDATE table1
   SET field1 = (SELECT SUM(t2.field2) 
                   FROM TABLE2 t2 
                  WHERE t2.field3 = field2)

14
मैंने तीन प्रश्नों को एक साथ रखा और एक निष्पादन योजना चलाई। इस जवाब में 44% की लागत थी।
मार्गरेट

यह मेरे लिए काम नहीं करता था, क्योंकि t2.filed3 टेबल 1.field2 के समान नाम था, इसलिए पर्दे के पीछे शामिल होने से ठीक से काम नहीं किया गया। (मैं मानता हूं कि पर्दे के पीछे एक जुड़ाव है)
जो

5

या आप JBrooks और OMG पॉनीज़ उत्तर का मिश्रण इस्तेमाल कर सकते हैं :

UPDATE table1
   SET field1 = (SELECT SUM(field2)
                   FROM table2 AS t2
                  WHERE t2.field3 = t1.field3)
  FROM table1 AS t1

16
मैंने तीन प्रश्नों को एक साथ रखा और एक निष्पादन योजना चलाई। इस जवाब में 51% की लागत थी।
मार्गरेट

ओकी डोकी! और प्रतिक्रिया के लिए धन्यवाद। मैं इसे अपने टूलबॉक्स में जोड़ूंगा। :-)
पाउलो सांतोस

ऐसा इसलिए होगा क्योंकि आप SUBQUERY का उपयोग कर रहे हैं जो SUM () हर पंक्ति को आग लगाने वाला है, जो कि मान्य है, भले ही अनुकूलक के साथ हो
clifton_h

4

CROSS APPLY का उपयोग करने के लिए एक अच्छी स्थिति

UPDATE t1
   SET t1.field1 = t2.field2Sum
  FROM table1 t1
 CROSS APPLY (SELECT SUM(field2) as field2Sum
                FROM table2 t2
               WHERE t2.field3 = t1.field3) AS t2

3

मुझे पता है कि सवाल SQL सर्वर को टैग किया गया है, लेकिन यदि आप PostgreSQL का उपयोग कर रहे हैं तो JOIN के साथ सावधान रहें । @ जेब्रोक जवाब से काम नहीं चलेगा:

UPDATE t1
SET t1.field1 = t2.field2Sum
FROM table1 t1
INNER JOIN (...) as t2
on t2.field3 = t1.field3  

आपको इसे इसके अनुकूल बनाना होगा:

UPDATE table1 t1
SET t1.field1 = t2.field2Sum
FROM (...) as t2
WHERE t2.field3 = t1.field3  

डाकग्रेक्यूएल द्वारा स्व-जुड़ने के बारे में विचार from_listकरने के लिए डॉक्टर में पैरामीटर देखें FROM: https://www.postgresql.org/docs/9.5/static/sql-update.html#AEN89239


0

आप नीचे दिए गए तरह सीटीई का भी उपयोग कर सकते हैं।

;WITH t2 AS (
    SELECT field3, SUM(field2) AS field2
    FROM table2
    GROUP BY field3
)
UPDATE table1
SET table1.field1 = t2.field2
FROM table1
INNER JOIN t2 ON table1.field3 = t2.field3
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.