【发布时间】:2012-03-19 11:06:12
【问题描述】:
在存储过程中运行查询时,我从 MySQL 收到此错误:
错误代码:1172 结果包含多于一行
我理解错误:我正在执行SELECT (...) INTO (var list),因此查询需要返回单行。当我使用LIMIT 1 或SELECT DISTINCT 时,错误消失了。
但是:当我手动运行原始查询时(没有 LIMIT 或 DISTINCT),它确实返回了一行。所以我怀疑我可能遇到了 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 添加到查询中。如果有一天我重温它,我会在这里发布新闻。