结果包含多行Error 1172 mysql

时间:2010-02-11 06:32:26

标签: mysql stored-procedures

您好我很难使用此存储过程。我得到错误: 结果由多行组成。

这是我的存储过程:

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 ;

非常感谢任何解决方案和建议!

5 个答案:

答案 0 :(得分:7)

我想问题就在这里:

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

并由此返回多行。 您如何解决它取决于您的要求。例如,是否存在多行意味着数据库需要进行一些清理?或者你应该采用'cost'的第一个值,或者id = ls_id的所有'cost'的总和?

编辑:

您的INTO子句正在尝试将多行写入单个变量。看看你的SQL,我想说的是潜在的问题是你的初始查询只是为每个ID的最新成本回收而被pceffdate的副本所拖累。如果是这种情况,这个SQL:

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

答案 1 :(得分:1)

这一行

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

一定是问题所在。它必须返回超过1行。因此,DBMS正在尝试将多个值设置为相同的东西,当然这是不可能的。

你的WHERE子句中还需要其他东西吗?

答案 2 :(得分:1)

问题在于

SELECT DISTINCTROW `itemcode` ID, `mlist` COST

可以针对每个ID存储多个成本,所以

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

可以为每个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

这两个值都是对该商品代码的最新pceffdate有效的值。

这会导致在项目代码1中选择mlist到ld_cost时出现问题,因为有两个匹配的值,而标量ld_cost只能容纳一个。

你真的需要查看purchcost中的数据。如果1个项目可能有多个条目具有相同日期/日期时间的不同mlist值,那么您需要决定应该如何处理。也许取最高值,或最低值,或任何值。或者这可能是数据中的错误。

答案 3 :(得分:0)

这是正确的解决方案。看看我对这个问题的回答MySQL Error 1172 - Result consisted of more than one row

谢谢。

答案 4 :(得分:0)

还有另一种可能性,就是你的参数“TDATE”与大写或小写或混合的表字段名相同。例如'tdate','tDate','TDATE'。

所以你应该检查一下。我以前打过这个。