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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:55:32