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

SQL子查询返回多行值错误排查及可行解决方案咨询

问题解决:Subquery returned more than 1 value 报错处理

错误原因

你遇到的报错核心原因是:CASE语句的THEN/ELSE分支里的子查询返回了多行结果。SQL明确规定,当子查询作为表达式(比如在CASE分支里赋值)或者跟在=、<等比较运算符后时,必须返回且仅返回单个值。移除其中一个分支后能正常运行,说明剩下的分支对应的子查询刚好都返回单行,但两个分支都保留时,存在某些行对应的子查询返回多行,触发了错误。

解决办法

方案1:强制子查询返回单个值(聚合函数)

如果业务逻辑允许对多行结果做汇总(比如求和),可以在子查询中使用SUM聚合函数,确保始终返回单个值;如果只需要取某一行数据,也可以用TOP 1(记得搭配ORDER BY保证结果稳定)。

修改后的SQL示例(以SUM为例):

SELECT
CASE
  WHEN ISNULL((
    SELECT xapIMCostingMethod
    FROM ProductionProperties), 0) = 2
  THEN ISNULL((
    SELECT SUM(CAST(ROUND((intUnitMaterialCost) * (-imtInventoryQuantityReceived + imtScrapQuantity), 2) AS NUMERIC(36, 2)))
    FROM PartTransactionCosts
    WHERE intPartTransactionID = imtPartTransactionID
    AND intCostType = 2), 0)
  ELSE ISNULL((
    SELECT SUM(CAST(ROUND((intUnitMaterialCost) * (-imtInventoryQuantityReceived + imtScrapQuantity), 2) AS NUMERIC(36, 2)))
    FROM PartTransactionCosts
    WHERE intPartTransactionID = imtPartTransactionID
    AND intCostType = 1), 0)
END AS ActMatCost
FROM PartTransactions

方案2:改用JOIN关联查询(性能更优)

把子查询转换成LEFT JOIN的形式,避免在CASE里嵌套子查询,同时能更清晰地处理多行数据的场景:

SELECT
  CASE
    WHEN ISNULL(pp.xapIMCostingMethod, 0) = 2
    THEN ISNULL(ptc2.cost_value, 0)
    ELSE ISNULL(ptc1.cost_value, 0)
  END AS ActMatCost
FROM PartTransactions pt
CROSS JOIN (SELECT xapIMCostingMethod FROM ProductionProperties) pp
LEFT JOIN (
  SELECT 
    intPartTransactionID,
    SUM(CAST(ROUND((intUnitMaterialCost) * (-imtInventoryQuantityReceived + imtScrapQuantity), 2) AS NUMERIC(36, 2))) AS cost_value
  FROM PartTransactionCosts
  WHERE intCostType = 2
  GROUP BY intPartTransactionID
) ptc2 ON pt.intPartTransactionID = ptc2.intPartTransactionID
LEFT JOIN (
  SELECT 
    intPartTransactionID,
    SUM(CAST(ROUND((intUnitMaterialCost) * (-imtInventoryQuantityReceived + imtScrapQuantity), 2) AS NUMERIC(36, 2))) AS cost_value
  FROM PartTransactionCosts
  WHERE intCostType = 1
  GROUP BY intPartTransactionID
) ptc1 ON pt.intPartTransactionID = ptc1.intPartTransactionID

这个方案先将PartTransactionCosts按intPartTransactionID和intCostType分组汇总,再关联到主表,性能比嵌套子查询更好,也从根源上避免了子查询返回多行的问题。

额外排查项

如果业务逻辑中每个intPartTransactionID+intCostType组合应该只有一行数据,那你需要检查PartTransactionCosts表是否存在重复数据,清理重复行也能直接解决该报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 03:10:56