【问题标题】:MySQL Error 1172 - Result consisted of more than one rowMySQL 错误 1172 - 结果包含多于一行
【发布时间】:2012-03-19 11:06:12
【问题描述】:

在存储过程中运行查询时,我从 MySQL 收到此错误:

错误代码:1172 结果包含多于一行

我理解错误:我正在执行SELECT (...) INTO (var list),因此查询需要返回单行。当我使用LIMIT 1SELECT DISTINCT 时,错误消失了。

但是:当我手动运行原始查询时(没有 LIMITDISTINCT),它确实返回了一行。所以我怀疑我可能遇到了 MySQL 错误。有谁知道会发生什么?

编辑

我正在按要求发布 SQL。以下划线开头的所有内容都是在过程中较早声明的变量。当我测试它时,我将 _cd_pai_vc 替换为导致问题的记录的 ID。

SELECT  a.valor,    IFNULL(p.valor, 0), fn_cd2alias(ra.cd_registro),    fn_cd2alias(IFNULL(p.valor,0))
INTO    _valor,     _cd_pai_vc,         _alias_verbete,                 _alias_pai
FROM dados_registros ra
    INNER JOIN dados_varchar255 a
    ON a.cd_registro = ra.cd_registro
        AND a.fl_excluido = 0
        AND a.alias = 'vc-verbetes-termo'
    LEFT OUTER JOIN dados_registros rp
        INNER JOIN dados_int p
        ON p.cd_registro = rp.cd_registro
            AND p.fl_excluido = 0
            AND p.alias = 'vc-remissoes-termo referenciado'
        INNER JOIN dados_int pt
        ON pt.cd_registro = rp.cd_registro
            AND pt.fl_excluido = 0
            AND pt.alias = 'vc-remissoes-tipo remissao'
            AND fn_cd2alias(pt.valor) = 'hierarquica'
    ON ra.cd_registro = rp.cd_entidade
        AND rp.fl_excluido = 0
        AND fn_cd2alias(rp.cd_modulo) = 'vc-remissoes'
WHERE ra.cd_registro = _cd_pai_vc 
    AND ra.fl_excluido = 0;

【问题讨论】:

  • @EugenRieck 添加了 SQL。我知道连接可能会导致获取额外的行,但是,正如我在问题中所述,当我使用实际 ID 而不是 _cd_pai_vc 进行测试时(并注释掉 INTO 部分),我只得到一行.
  • 看起来很像 _cd_pai_vc 的值错误:只是为了测试,在存储过程中将其替换为手动运行时仅给出单行的常量,并查看错误是否仍然存在。
  • @EugenRieck:查询实际上是在过程的循环内。它向上遍历一棵树,_cd_pai_id 在每次迭代中被重新定义为当前的 parent_id。无论如何,我尝试了你的建议,用涉及的每个 parent_id 替换 var,一次一个,我没有收到任何错误。怎么会?当我 SELECT 调试变量的当前值时,它显示的值与我尝试的常量完全相同,但随后出现错误。
  • 更改代码以返回多行,或将它们插入某处。这可能会给你一个提示,为什么它会发生。这可能不是 MySQL 的错误。
  • @IamJohnGalt 我放弃了理解原因,只是将 DISTINCT 添加到查询中。如果有一天我重温它,我会在这里发布新闻。

标签: mysql stored-procedures


【解决方案1】:

我在mysql中也遇到过同样的错误。

MySQL 错误 1172 - 结果包含多行

然后我看到了问题:

mysql stored procedure error (1172, 'Result consisted of more than one row')

但这不是我要问的。 LIMIT 1;-没有达到我的预期。它只会返回所有案例的第一行。

然后我开始深入研究这个问题,现在我得到了解决方案。

发生这种情况是因为存储过程的代码返回了多行,那是因为我的代码中有很多 extra spaces and tab characters [我为存储过程编写的代码],当我用一/两个适当的制表符删除它们时- 它就像一个飞行器

我不知道你遇到的情况是否相同。还是试试吧。

谢谢。

【讨论】:

    【解决方案2】:

    我遇到了这个问题,当我在 select 语句中同时使用表名和列名时发现它消失了,即使是简单的语句。

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题,当我输入 table alias 时,它就像一个魅力。

      SELECT t.tax_amount,t.tax_percentage FROM nepse_tax t
      

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题,Nava Bogatee 的解决方案就像一个魅力, 以下是程序的一部分

        select attendance
        into brb
        from Stud
        where Rno like rno;
        

        这不起作用,我不知道为什么。 然后我把它改成了

        select t.attendance
        into brb
        from Stud t
        where t.Rno like rno;
        

        它奏效了。 我猜由于某种原因,Rno 列正在返回表中的所有值,这就是多行错误的原因。

        【讨论】:

          【解决方案5】:

          我遇到的问题是 IN 参数和列名都相同,因此更改了 IN 参数名并且它起作用了

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-01-15
            • 1970-01-01
            • 1970-01-01
            • 2018-03-07
            • 2021-03-21
            • 1970-01-01
            • 2023-03-21
            • 1970-01-01
            相关资源
            最近更新 更多