存储过程执行报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
相关产品推荐
相关产品推荐

