You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL存储过程运行报错Subquery returns more than 1 row问题求助

报错根因

Subquery returns more than 1 row报错的核心原因是IF判断条件中的子查询未做聚合或存在性校验,当同一个部门下存在多条符合筛选条件的记录时,子查询会返回多行结果,无法直接和数值0做比较,直接触发报错。

原代码存在的其他问题

  • 子查询逻辑不符合需求:原本要判断对应部门是否存在对应优先级的用户,但原写法是返回所有符合条件的部门id值,而非判断是否存在匹配项
  • 结果查询无过滤条件:IF判断通过后执行的查询没有加部门id过滤,会返回全表的用户数据,完全不符合按传入部门id查询的需求
  • 逻辑冗余:优先级参数的判断重复写在每个子查询中,增加了不必要的查询开销

修正后的存储过程代码

PROCEDURE `get_parent`(in id_dept int, in id_priorty int )
BEGIN
    -- 优先级3查员工表
    IF id_priorty = 3 AND EXISTS(SELECT 1 FROM employee_tb WHERE id_dept = id_dept) THEN
        SELECT id_employee, full_name, 3 AS type FROM employee_tb WHERE id_dept = id_dept;
    -- 优先级2查组长表
    ELSEIF id_priorty = 2 AND EXISTS(SELECT 1 FROM leader_tb WHERE id_dept = id_dept) THEN
        SELECT id_leader, full_name, 2 AS type FROM leader_tb WHERE id_dept = id_dept;
    -- 优先级1查经理表
    ELSEIF id_priorty = 1 AND EXISTS(SELECT 1 FROM manager_tb WHERE id_dept = id_dept) THEN
        SELECT id_manager, full_name, 1 AS type FROM manager_tb WHERE id_dept = id_dept;
    ELSE
        SELECT 'failed' AS result;
    END IF;
END

修正说明

  • 用EXISTS()做存在性校验,仅判断是否有匹配记录,不会返回多行数据,彻底解决报错问题
  • 给所有查询语句增加了部门id过滤,返回结果完全匹配传入的部门参数
  • 将优先级参数的判断从子查询中移出,不需要每次执行子查询都过滤优先级参数,执行效率更高

内容的提问来源于stack exchange,提问作者marwan steam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 01:27:04