结果包含多行 错误 1172 MySQL

25
嗨,我在处理这个存储过程时遇到了困难。我收到了以下错误信息: 结果包含多行。

这是我的存储过程:

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 ;

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

看一下我的回答,解决这个问题 [MySQL Error 1172 - Result consisted of more than one row][1]谢谢。 [1]: https://dev59.com/M2HVa4cB1Zd3GeqPiwYG - Ataboy Josef
6个回答

10

我认为问题在这里:

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

它已经有了DISTINCTROW,所以它只会返回1个,对吧?你能推荐一个解决方法吗? - ryn6
1
这不是DISTINCTROW的作用(顺便说一下,它与DISTINCT是同义词)。如果每个ID有多个不同的成本值,DISTINCT / DISTINCTROW将返回多行。DISTINCT / DISTINCTROW仅意味着您不会有重复的行。因此,例如,如果您有3行具有50、50和100的值,则DISTINCT / DISTINCTROW将返回2行(其中一个为50,另一个为100)。 - MartW
嗯,那我应该从那一行中删除DISTINCTROW吗?我已经在我的SELECT语句中删除了DISTINCTROW,但它仍然显示相同的错误。 - ryn6

2

问题是

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

这两个值都是在该itemcode的最近pceffdate生效的。

这将导致选择mlist到itemcode 1的ld_cost时出现问题,因为有两个匹配的值,而标量ld_cost只能容纳一个。

您确实需要查看purchcost中的数据。如果一个项目可能有多个条目,在相同的日期/时间具有不同的mlist值,则需要决定如何处理。也许取最高值、最低值或任何值。或者这可能是数据错误。


嗯,我有点困惑。在prod_itemcost临时表中,我需要获取每个产品的所有最新价格。 - ryn6

1

这一行

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

问题肯定出在这里。它一定返回了多行数据。因此,数据库管理系统试图将多个值设置为相同的内容,这显然是不可能的。

你需要在WHERE子句中添加其他条件吗?


0

您正在将一个数组插入到变量中,而不是单个值,这就是问题出现的原因。

例如:

    DECLARE name varchar;

    select f_name into name from student; 

这里的名称只接受单个名称,而不是多个名称;


在这种情况下,如果我想从存储过程中返回多行,该如何解决这个问题? - Prasanna
1
Prasanna,你可以使用游标来处理这种情况。例如:DECLARE curColumn CURSOR FOR SELECT colname FROM pbx_pack_menu WHERE id NOT IN (7,8,9,11,14,87,118,119); - Nagender Pratap Chauhan

0
我遇到了与下面相同的错误:
错误 1172 (42000):结果包含多行
因为我试图将多行的“name”列值存储到“@result”中,它是一个用户定义的会话变量链接1,如下所示:
mysql> SELECT * FROM person;
+----+-------+
| id | name  |
+----+-------+
|  1 | John  |
|  2 | David |
+----+-------+
...
mysql> SELECT name INTO @result FROM person; -- Error

但是,我只能将一行的name列的值存储到@result中,如下所示,没有出现错误:
mysql> SELECT name INTO @result FROM person WHERE id = 1;
...
mysql> SELECT @result;  
+---------+
| @result |
+---------+
| John    |
+---------+

0

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

因此,您应该检查一下。我之前也遇到过这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接