2010-02-11 3 views
11

हैलो मुझे इस संग्रहीत प्रक्रिया के साथ कठिन समय है। मुझे त्रुटि मिल रही है: परिणाम एक से अधिक पंक्ति शामिल थे।परिणाम एक से अधिक पंक्तियों में शामिल है त्रुटि 1172 mysql

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `dss`.`COSTRET` $$ 
CREATE DEFINER=`dwadmin`@`192.168.%.%` PROCEDURE `COSTRET`(TDATE DATE) 
BEGIN 
    DECLARE done INT DEFAULT 0; 
    DECLARE ls_id VARCHAR(8); 
    DECLARE ld_cost DECIMAL(10,4); 
     DECLARE ld_retail DECIMAL(10,4); 
    DECLARE cur1 CURSOR FOR SELECT DISTINCT `id` FROM `prod_performance` WHERE `psc_week` = TDATE; 
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; 

    -- Get the Cost 
    CREATE TEMPORARY TABLE IF NOT EXISTS `prod_itemcost` 
    SELECT DISTINCTROW `itemcode` ID, `mlist` COST 
    FROM (SELECT `itemcode`, `pceffdate`, `mlist` 
     FROM `purchcost` a 
     where `pceffdate` = (SELECT MAX(z.`pceffdate`) FROM `purchcost` z WHERE z.`itemcode` = a.`itemcode` 
     AND z.`pceffdate` <= TDATE)) tb 
    ORDER BY `itemcode`; 

    OPEN cur1; 
    REPEAT 
     FETCH cur1 INTO ls_id; 
     IF NOT done THEN 
      SELECT DISTINCTROW `cost` INTO ld_cost FROM `prod_itemcost` WHERE id = ls_id; 

     UPDATE LOW_PRIORITY `prod_performance` SET `current_cost` = ld_cost WHERE `psc_week` = TDATE and `id` = ls_id; 
     END IF; 
    UNTIL done END REPEAT; 
    CLOSE cur1; 

    -- Destroy Temporary Tables 
    DROP TEMPORARY TABLES IF EXISTS `prod_itemcost`; 
END $$ 

DELIMITER ; 

किसी भी समाधान और सिफारिशों की बहुत सराहना कर रहे हैं:

यहाँ मेरी संग्रहीत प्रक्रिया है!

+0

इस सवाल का मेरा उत्तर पर एक नजर डालें [MySQL त्रुटि 1172 - परिणाम एक से अधिक पंक्तियां शामिल थे] [1] धन्यवाद। [1]: http://stackoverflow.com/questions/9507993/mysql-error-1172-result-consisted-of-more-than-one-row –

उत्तर

1

इस लाइन

SELECT MAX(z.`pceffdate`) FROM `purchcost` z WHERE z.`itemcode` = a.`itemcode` 
    AND z.`pceffdate` <= TDATE 

समस्या होनी ही थी। यह 1 से अधिक पंक्ति लौटाना चाहिए। इसलिए, डीबीएमएस एक ही चीज़ को कई मान सेट करने की कोशिश कर रहा है, जो निश्चित रूप से ऐसा नहीं कर सकता है।

आप अपने कहां खंड वहाँ में कुछ और की ज़रूरत है?

6

मैं इस समस्या कहेंगे यहाँ है:

SELECT DISTINCTROW `cost` INTO ld_cost FROM `prod_itemcost` WHERE id = ls_id; 

और इस वापस लौटने वाले एक से अधिक पंक्ति की वजह से। आप इसे कैसे हल करते हैं अपनी आवश्यकताओं पर निर्भर करता है। क्या एकाधिक पंक्तियों का अस्तित्व डेटाबेस को कुछ सफाई की ज़रूरत है, उदाहरण के लिए? या आप आईडी = ls_id के लिए 'लागत' का पहला मूल्य, या शायद सभी 'लागत' का योग लेना चाहिए?

संपादित करें:

आपका जांच खंड एक एकल चर में अनेक पंक्तियां लिखने के लिए प्रयास कर रहा है। अपने एसक्यूएल को देखते हुए, मैं कहेंगे मूल समस्या यह है कि अपने प्रारंभिक क्वेरी वापस pceffdate के डुप्लिकेट से खींचने के लिए बस प्रत्येक आईडी के लिए नवीनतम लागत पंगु जा रहा है। इस मामले में, इस एसक्यूएल है:

SELECT DISTINCTROW `itemcode` ID, `mlist` COST 
    FROM (SELECT `itemcode`, `pceffdate`, `mlist` 
     FROM `purchcost` a 
     where `pceffdate` = (SELECT MAX(z.`pceffdate`) FROM `purchcost` z WHERE z.`itemcode` = a.`itemcode` 
     AND z.`pceffdate` <= TDATE)) tb 

की तुलना में अधिक पंक्तियों को वापस होगा सिर्फ इस:

SELECT DISTINCTROW `itemcode` ID 
    FROM (SELECT `itemcode`, `pceffdate`, `mlist` 
     FROM `purchcost` a 
     where `pceffdate` = (SELECT MAX(z.`pceffdate`) FROM `purchcost` z WHERE z.`itemcode` = a.`itemcode` 
     AND z.`pceffdate` <= TDATE)) tb 
+0

इसमें पहले से ही एक डिस्टिंट्रो है इसलिए यह केवल 1 लौटाएगा सही? क्या आप एक कामकाज की सिफारिश कर सकते हैं? – ryn6

+0

यह नहीं है कि DISTINCTROW क्या करता है (जो आकस्मिक रूप से DISTINCT का समानार्थी है)। यदि आपके पास प्रत्येक आईडी के लिए लागत के लिए कई अलग-अलग मान हैं, तो DISTINCT/DISTINCTROW कई पंक्तियां वापस कर देगा। DISTINCT/DISTINCTROW का मतलब है कि आपके पास डुप्लिकेट पंक्तियां नहीं होंगी। तो, उदाहरण के लिए, यदि आपके पास 50, 50 और 100 के मानों के साथ 3 पंक्तियां हैं, तो DISTINCT/DISTINCTROW 2 पंक्तियां लौटाएगी (एक 50 के साथ और 100 में से एक)। – MartW

+0

umm तो मुझे उस रेखा से DISTINCTROW को हटा देना चाहिए? । मैंने अपने चुनिंदा स्टेमेंट पर DISTINCTROW चीज़ को हटा दिया और यह अभी भी एक ही त्रुटि – ryn6

1

समस्या यह है कि

SELECT DISTINCTROW `itemcode` ID, `mlist` COST 

प्रत्येक आईडी के खिलाफ कई लागत संग्रहीत कर सकती है, और इसलिए

SELECT DISTINCTROW `cost` INTO ld_cost FROM `prod_itemcost` WHERE id = ls_id; 

प्रत्येक आईडी के लिए कई पंक्तियां लौट सकते हैं।

उदाहरण के लिए, यदि purchcost निहित निम्नलिखित:

itemcode mlist pceffdate 
1   10.99 10-apr-2009 
1   11.99 10-apr-2009 
1   9.99 09-apr-2009 

तो अस्थायी तालिका prod_itemcost होते हैं:

itemcode mlist 
1   10.99 
1   11.99 

इन दोनों मानों कि itemcode के लिए नवीनतम pceffdate पर प्रभाव में थे जा रहा है ।

दो मिलान मूल्यों देखते हैं, और अदिश ld_cost केवल एक ही पकड़ सकते हैं, क्योंकि यह तो itemcode 1 के लिए ld_cost में Mlist का चयन के साथ एक समस्या का कारण होगा।

आप वास्तव में purchcost में डेटा को देखने की जरूरत है। यदि यह संभव है 1 आइटम एक ही तिथि/दिनांक के लिए अलग Mlist मूल्यों के साथ एक से अधिक प्रविष्टियां प्राप्त करना है, तो आप को फैसला करना है कि कैसे संभाला जाना चाहिए की जरूरत है।शायद उच्चतम मूल्य, या सबसे कम मूल्य, या किसी भी मूल्य ले लो। या शायद यह डेटा में एक त्रुटि है।

+0

उहम्म थोड़ा उलझन में हूँ। prod_itemcost अस्थायी तालिका में मुझे जो चाहिए वह प्रति उत्पाद की सभी नवीनतम कीमतें प्राप्त करना है। – ryn6

0

एक और संभावना है, यह आपका पैरामीटर "टीडीएटी" है जो टेबल फ़ील्ड नाम के रूप में अपरकेस या लोअरकेस या मिश्रित में है। जैसे 'tdate', 'tdate', 'TDATE'।

तो आपको यह जांचना चाहिए। मैंने पहले इसे मारा।

संबंधित मुद्दे