2008-11-14 17 views
17

मेरे पास एक मास्टर/विवरण तालिका है और विस्तार तालिका के विरुद्ध मास्टर तालिका में कुछ सारांश मान अपडेट करना चाहते हैं। मैं जानता हूँ कि मैं उन्हें इस तरह अद्यतन कर सकते हैं:एक ही कथन में एकाधिक मान अपडेट करें

update MasterTbl set TotalX = (select sum(X) from DetailTbl where DetailTbl.MasterID = MasterTbl.ID) 
update MasterTbl set TotalY = (select sum(Y) from DetailTbl where DetailTbl.MasterID = MasterTbl.ID) 
update MasterTbl set TotalZ = (select sum(Z) from DetailTbl where DetailTbl.MasterID = MasterTbl.ID) 

लेकिन, मुझे कुछ इस तरह एक भी बयान में यह करने के लिए, चाहते हैं:

update MasterTbl set TotalX = sum(DetailTbl.X), TotalY = sum(DetailTbl.Y), TotalZ = sum(DetailTbl.Z) 
from DetailTbl 
where DetailTbl.MasterID = MasterTbl.ID group by MasterID 

लेकिन वह काम नहीं करता। मैंने उन संस्करणों को भी आजमाया है जो "समूह द्वारा" खंड को छोड़ देते हैं। मुझे यकीन नहीं है कि मैं अपने विशेष डेटाबेस (लाभ), या मेरे एसक्यूएल की सीमाओं के खिलाफ बंपिंग कर रहा हूं। शायद उत्तरार्द्ध। क्या कोई मदद कर सकता है?

उत्तर

3

आप एक अद्यतन कथन पर समूह क्यों कर रहे हैं? क्या आप वाकई उस हिस्से का हिस्सा नहीं हैं जिससे क्वेरी विफल हो रही है? इस प्रयास करें:,

Update MasterTbl Set 
    TotalX = Sum(D.X),  
    TotalY = Sum(D.Y),  
    TotalZ = Sum(D.Z) 
From MasterTbl M Join DetailTbl D 
    On D.MasterID = M.MasterID 

जो डेटाबेस का उपयोग कर रहे पर निर्भर करता है कि अगर नहीं करता है:

UPDATE 
    MasterTbl 
SET 
    TotalX = (SELECT SUM(X) from DetailTbl where DetailTbl.MasterID = MasterTbl.ID), 
    TotalY = (SELECT SUM(Y) from DetailTbl where DetailTbl.MasterID = MasterTbl.ID), 
    TotalZ = (SELECT SUM(Z) from DetailTbl where DetailTbl.MasterID = MasterTbl.ID) 
WHERE 
    .... 
+0

@ क्रिस, जो मेरे लिए भी काम नहीं करता है। यदि यह आपके लिए काम करता है, तो शायद मैं अपने विशेष डेटाबेस की सीमा में कूद रहा हूं। – Kluge

+0

मैंने अब अपने मूल प्रश्न को स्पष्ट करने के लिए स्पष्ट किया है कि मैंने "समूह द्वारा" खंड को छोड़ने का प्रयास किया है। धन्यवाद! – Kluge

+0

आप किस डेटाबेस सर्वर/संस्करण का उपयोग कर रहे हैं? जब आप मेरा एसक्यूएल कहते हैं, तो क्या आपका मतलब है "मेरे एसक्यूएल कौशल" या "mySQL, सर्वर"? – Chris

2

आप हर क्षेत्र के लिए एक उप क्वेरी के साथ करने की कोशिश की है काम नहीं करते हैं, फिर कोशिश करें (यह गैर-मानक एसक्यूएल है लेकिन SQL सर्वर में कानूनी है):

Update M Set 
    TotalX = Sum(D.X),  
    TotalY = Sum(D.Y),  
    TotalZ = Sum(D.Z) 
From MasterTbl M Join DetailTbl D 
    On D.MasterID = M.MasterID 
+0

@ मिलन, आप सही हैं, यह काम करेगा। हालांकि, मुझे लगता है कि यह मेरे उदाहरण में तीन बयानों से अधिक तेज़ नहीं होगा। मुझे लगता है कि मुझे दोनों तरीकों से प्रयास करना चाहिए और समय की तुलना करना चाहिए। – Kluge

18

इस प्रयास करें:

update 
    MasterTbl 
set 
    TotalX = Sum(DetailTbl.X), 
    TotalY = Sum(DetailTbl.Y), 
    TotalZ = Sum(DetailTbl.Z) 
from 
    DetailTbl 
where 
    DetailTbl.MasterID = MasterID 
+0

मैंने दोनों की कोशिश की आपके दृष्टिकोणों और उन्हें काम करने के लिए नहीं मिल सका। मेरा डेटाबेस केवल कुछ एक्सटेंशन के साथ SQL-92 का समर्थन करता है। आप जिस कोड का उपयोग कर रहे हैं उसका समर्थन करने वाले कोड का समर्थन करता है? – Kluge

+0

SQL सर्वर इस वाक्यविन्यास का समर्थन करता है ... यदि आपका डेटाबेस नहीं करता है इसका समर्थन करें, तो मुझे लगता है कि आप एकाधिक सबक्वायरी दृष्टिकोण से फंस गए हैं .. जैसा कि –

+2

से नीचे मिलन द्वारा अनुशंसित किया गया है यह कानूनी SQL नहीं है। अद्यतन में कोई 'FROM' खंड नहीं है। http://dev.mysql.com/ दस्तावेज़/refman/6.0/en/update.html –

2

इस प्रयास करें:

update MasterTbl M, 
     (select sum(X) as sX, 
       sum(Y) as sY, 
       sum(Z) as sZ, 
       MasterID 
     from DetailTbl 
     group by MasterID) A 
set 
    M.TotalX=A.sX, 
    M.TotalY=A.sY, 
    M.TotalZ=A.sZ 
where 
    M.ID=A.MasterID 
3

ओरेकल में समाधान होगा:

UPDATE 
    MasterTbl 
SET 
    (TotalX,TotalY,TotalZ) = 
     (SELECT SUM(X),SUM(Y),SUM(Z) 
     from DetailTbl where DetailTbl.MasterID = MasterTbl.ID) 

पता नहीं है आपके सिस्टम एक ही अनुमति देता है।

+0

मेरा डेटाबेस इसकी अनुमति नहीं देता है, लेकिन अन्य डेटाबेस विक्रेताओं के दृष्टिकोण को देखना अच्छा लगता है। – Kluge

0

यदि आपका डीबी इसका समर्थन करता है, तो एक एसक्यूएल स्ट्रिंग में सभी 3 अपडेटों को संयोजित करने से LAN पर पूछताछ के दौरान सर्वर-राउंड-ट्रिप पर सहेजा जाएगा। तो अगर कुछ और काम नहीं करता है, तो यह आपको थोड़ा सुधार दे सकता है। ठेठ 'बहु-कथन डेलीमीटर अर्ध-कॉलन है, उदाहरण:

'update x....;update y...;update...z' 
संबंधित मुद्दे