2010-05-16 15 views
5

मान लीजिए मैं MyTable नामक एक MySQL तालिका, कि इस तरह दिखता है:,सम्मिलित नई पंक्ति

+----+------+-------+ 
| Id | Type | Value | 
+----+------+-------+ 
| 0 | A |  1 | 
| 0 | B |  1 | 
| 1 | A |  2 | 
| 1 | B |  3 | 
| 2 | A |  5 | 
| 2 | B |  8 | 
+----+------+-------+ 

और प्रत्येक Id के लिए, मैं प्रकार C जिसका साथ एक नई पंक्ति सम्मिलित करना चाहते हैं Value उसी Id की पंक्तियों के लिए A और B मानों का योग है। इस तालिका की प्राथमिक कुंजी (Id, Type) है, इसलिए आईडी के प्रकार, टाइप जोड़े के दोहराव का कोई सवाल नहीं है।

मैं पंक्तियों मैं इस प्रश्न के साथ चाहते हैं बना सकते हैं:

SELECT MyTable_A.Id AS Id, 'C' AS Type, (A_Val + B_Val) AS Value FROM 
     (SELECT Id, Value AS A_Val FROM MyTable WHERE Type='A') AS MyTable_A 
    JOIN (SELECT Id, Value AS B_Val FROM MyTable WHERE Type='B') AS MyTable_B 
    ON MyTable_A.Id = MyTable_B.Id 

देता है:

+----+------+-------+ 
| Id | Type | Value | 
+----+------+-------+ 
| 0 | C |  2 | 
| 1 | C |  5 | 
| 2 | C | 13 | 
+----+------+-------+ 

लेकिन सवाल यह है: मैं इस परिणाम का उपयोग कैसे करूँ डालने के लिए C पंक्तियों type- उत्पन्न MyTable में?

क्या कोई प्रश्न के साथ ऐसा करने का अपेक्षाकृत सरल तरीका है, या मुझे एक संग्रहीत प्रक्रिया लिखने की आवश्यकता है? और यदि उत्तरार्द्ध, मार्गदर्शन सहायक होगा, क्योंकि मैं उनमें बहुत अच्छी तरह से नहीं जानता हूं।

+0

यह आपके डेटा को सामान्य बना देगा। तुम ऐसा क्यों करना चाहते हो? ए और बी के परिवर्तन के बाद क्या होगा? क्या कोई सी को संशोधित कर सकता है? –

+0

यह आवश्यक है कि 'सी' को 'ए + बी' के रूप में परिभाषित किया गया हो, और तालिकाओं में मौजूद सभी प्रविष्टियों में वर्तमान में 'ए' और' बी' मान हैं, वहां भविष्य की प्रविष्टियां होंगी जहां केवल 'सी' ज्ञात है और जहां 'ए' और 'बी' घटकों में टूटने का निर्धारण करने का कोई तरीका नहीं है। मुझे एहसास है कि इसका मतलब है कि मुझे बाहरी सत्यापन तर्क लागू करना होगा जो सुनिश्चित करता है कि 'आईडी = 'बी' * के नाम पर 'आईडी =' बी '* पर सम्मिलन और अपडेट के लिए' सी = ए + बी 'है। –

उत्तर

4

तुम बस जोड़ सकते हैं कि चयन एक डालने पर (थोड़ा में "आप as खंड की जरूरत नहीं है" के रूप में संशोधित)। उदाहरण के लिए:

insert into MyTable (Id,Type,Value) 
    select MyTable_A.Id, 'C', (A_Val + B_Val) from ... 

यह सोचते हैं कि आपकी क्वेरी वास्तव में सही है - मुझे लगता है कि :-)

आगे उदाहरण के द्वारा की कोई मूल्यांकन,

insert into MyTable (Id,Type,Value) 
    select Id+1000, 'C', Value from MyTable where Type = 'A' 

निम्नलिखित पंक्तियाँ जोड़ना होगा बनाने:

+------+------+-------+ 
| Id | Type | Value | 
+------+------+-------+ 
| 1000 | C |  1 | 
| 1001 | C |  2 | 
| 1002 | C |  5 | 
+------+------+-------+ 
+0

बढ़िया! सरल, और यहां तक ​​कि पूर्व-स्पष्ट रूप से मेरे फॉलोअप प्रश्न का उत्तर दिया "क्या होगा यदि तालिका में अन्य कॉलम हैं जो मैं केवल उनके डिफ़ॉल्ट मान लेना चाहता हूं?" –

2

बस अपने चयन बयान से पहले निम्न पंक्ति जोड़ें:

INSERT MyTable (Id, Type, Value) 
संबंधित मुद्दे