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

存储过程执行报Subquery returned more than 1 value错误如何解决

问题根因

你CASE语句中嵌套的标量子查询,在TeacherBoard表存在同一个教师ID与同一个BoardID对应多条重复记录的场景时,会返回多条BoardID结果,而>运算符要求两侧的运算对象只能是单个值,因此触发了该报错。

解决方案

方案1:使用EXISTS关键字改写(最推荐,性能最优、逻辑最准确)

EXISTS仅判断是否存在匹配记录,不需要关心匹配的条数,天然规避多值返回问题,修改后的存储过程如下:

CREATE PROCEDURE [dbo].[spBoardGetByTeacherID]  
 @TeacherID int = NULL  
AS  
BEGIN  
    SELECT 
        b.ID,
        b.[FullName],
        b.[Code],
        CASE WHEN EXISTS (
            SELECT 1 FROM TeacherBoard 
            WHERE BoardID = b.ID AND [TeacherID] = @TeacherID
        ) THEN 1 ELSE 0 END AS Selected    
    FROM Board b     
    WHERE b.IsDeleted=0 AND b.IsActive=1     
END

方案2:强制子查询返回单值

如果不想调整原有逻辑结构,可以给子查询增加聚合函数或者TOP限制,强制返回单个值:

-- 加TOP 1限制
CASE WHEN (SELECT TOP 1 BoardID FROM TeacherBoard WHERE b.ID = BoardID AND [TeacherID] = @TeacherID) > 0 THEN 1 ELSE 0 END AS Selected
-- 用COUNT统计匹配条数
CASE WHEN (SELECT COUNT(BoardID) FROM TeacherBoard WHERE b.ID = BoardID AND [TeacherID] = @TeacherID) > 0 THEN 1 ELSE 0 END AS Selected

可选补充:从根源避免重复数据

如果业务上TeacherBoard表不允许同一个教师绑定同一个看板多次,建议给表增加联合唯一约束,从源头避免脏数据产生:

ALTER TABLE TeacherBoard ADD CONSTRAINT UQ_TeacherBoard_TeacherID_BoardID UNIQUE (TeacherID, BoardID)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:15:05