【问题标题】:Result consisted of more than one row Error 1172 mysql结果包含多行错误 1172 mysql
【发布时间】:2011-01-15 14:35:52
【问题描述】:

您好,我很难使用这个存储过程。我收到错误: 结果包含不止一行。

这是我的存储过程:

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 stored-procedures


【解决方案1】:

我想说问题就在这里:

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

并由此导致返回多行。 如何解决它取决于您的要求。例如,多行的存在是否意味着数据库需要一些清理?或者您应该取“成本”的第一个值,还是 id = ls_id 的所有“成本”的总和?

编辑:

您的 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 对吗?你能推荐一个解决方法吗?
  • 这不是 DISTINCTROW 所做的(顺便说一下,它是 DISTINCT 的同义词)。如果每个 id 有多个不同的成本值,则 DISTINCT/DISTINCTROW 将返回多行。 DISTINCT/DISTINCTROW 仅仅意味着你不会有重复的行。因此,例如,如果您有 3 行的值分别为 50、50 和 100,则 DISTINCT/DISTINCTROW 将返回 2 行(一行为 50,另一行为 100)。
  • 嗯,所以我应该从该行中删除 DISTINCTROW 吗? .我删除了我的选择状态上的 DISTINCTROW 东西,它仍然给出同样的错误
【解决方案2】:

这一行

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

一定是问题所在。它必须返回超过 1 行。因此,DBMS 试图为同一事物设置多个值,这当然是做不到的。

您的 WHERE 子句中还需要其他内容吗?

【讨论】:

    【解决方案3】:

    问题是

    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 生效的值。

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

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

    【讨论】:

    • 嗯,我有点困惑。我需要在 prod_itemcost 临时表中获取每个产品的所有最新价格。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      喜欢:

          DECLARE name varchar;
      
          select f_name into name from student; 
      

      这里的名字将只接受一个名字而不是多个名字;

      【讨论】:

      • 如果我想从程序中返回多行,如何解决这个问题?
      • Prasanna ......您可以在这种情况下使用光标。像:DECLARE curColumn CURSOR FOR SELECT colname FROM pbx_pack_menu WHERE id NOT IN (7,8,9,11,14,87,118,119);
      猜你喜欢
      • 2018-03-07
      • 2012-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-21
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多