SQL子查询返回多行值报错:修改应用查询后无法运行
解决SQL子查询返回多行的报错问题
问题分析
你遇到的Subquery returned more than 1 value报错,根源是你在第二个SELECT语句的第7列添加的子查询:
(select c.dj from YK_kc c where c.Ypcode = b.Ypcode)
这个子查询对于某些Ypcode,在YK_kc表中返回了多条记录(也就是同一个药品编码对应多个单价)。而SQL规定,当子查询作为表达式使用(比如作为SELECT列表里的一个字段,或者放在=/<等比较符右侧)时,必须保证只返回1行1列的结果,否则引擎无法确定该取哪个值。
解决方案
根据你的业务需求,有几种处理方式:
1. 确保子查询只返回唯一值
如果业务上每个Ypcode在YK_kc中应该只有一条记录,你可以先检查数据是否存在重复,或者用DISTINCT强制返回唯一值:
SELECT fycode, fyname, class3, '', '', '', defje, zjm, '', '' FROM zy_fy UNION ALL SELECT Ypcode, Ypname, (select a.lbname from YK_yplb a where a.lbid = b.yplb), gg, sldw, '', (select DISTINCT c.dj from YK_kc c where c.Ypcode = b.Ypcode), '', '', '' FROM YK_ypzd b UNION ALL SELECT FYID, NAME, DYKS+'-'+CLASS2, '', '次', '', FYMONEY, ZJM, ZJM1, '' FROM mz_fy
2. 指定取特定规则的单价
如果同一个Ypcode确实存在多个单价,你需要明确业务规则——比如取最大/最小单价,或者最新的单价:
- 取最大单价:
(select MAX(c.dj) from YK_kc c where c.Ypcode = b.Ypcode) - 取最小单价:
(select MIN(c.dj) from YK_kc c where c.Ypcode = b.Ypcode) - 取最新的单价(假设表中有
createtime时间字段):(select TOP 1 c.dj from YK_kc c where c.Ypcode = b.Ypcode ORDER BY createtime DESC)
以取最大单价为例,修改后的SQL:
SELECT fycode, fyname, class3, '', '', '', defje, zjm, '', '' FROM zy_fy UNION ALL SELECT Ypcode, Ypname, (select a.lbname from YK_yplb a where a.lbid = b.yplb), gg, sldw, '', (select MAX(c.dj) from YK_kc c where c.Ypcode = b.Ypcode), '', '', '' FROM YK_ypzd b UNION ALL SELECT FYID, NAME, DYKS+'-'+CLASS2, '', '次', '', FYMONEY, ZJM, ZJM1, '' FROM mz_fy
3. 改用JOIN替代子查询(更推荐)
嵌套子查询不仅可读性差,性能也不如直接JOIN。你可以把YK_ypzd和YK_kc做关联,用聚合函数处理多行数据:
SELECT fycode, fyname, class3, '', '', '', defje, zjm, '', '' FROM zy_fy UNION ALL SELECT b.Ypcode, b.Ypname, a.lbname, b.gg, b.sldw, '', MAX(c.dj), -- 根据业务选择MAX/MIN等聚合方式 '', '', '' FROM YK_ypzd b LEFT JOIN YK_yplb a ON a.lbid = b.yplb LEFT JOIN YK_kc c ON c.Ypcode = b.Ypcode GROUP BY b.Ypcode, b.Ypname, a.lbname, b.gg, b.sldw UNION ALL SELECT FYID, NAME, DYKS+'-'+CLASS2, '', '次', '', FYMONEY, ZJM, ZJM1, '' FROM mz_fy
这种方式更直观,也更容易维护,适合复杂的关联场景。
总结
你需要先明确业务逻辑:是数据存在重复需要清理,还是需要按特定规则选取单价,然后选择对应的处理方式即可解决这个报错。
内容的提问来源于stack exchange,提问作者JIA
相关产品推荐
相关产品推荐

