SQL查询报错:子查询返回多行值,请求排查具体子查询
问题排查与修复
首先,报错明确是子查询作为表达式时返回了多行,我们逐个分析你的两个子查询:
1. 第一个子查询(求和)
(select sum( T2.OnHand) AS 'QTY' from OITW T2 join OITM T3 on T2.ItemCode = T3.ItemCode where T3.[ItemCode] = T1.[ItemCode] and WhsCode in ('KHI-04', 'KHI-12', 'RWP-01', 'LHR-01'))
这个子查询使用了sum()聚合函数,无论匹配多少行,都会返回单个值(无匹配时返回null),所以它不会导致这个报错。
2. 第二个子查询(取Quantity)
(select Quantity from drf1 drf inner join OITM itm on drf.[ItemCode] = itm.[ItemCode] where drf.[ItemCode] = T1.[ItemCode])
这个子查询没有任何聚合或限制行数的逻辑,当某个ItemCode在drf1表中存在多条记录时,它会返回多行结果,直接用在减法表达式里就触发了报错。
排查验证
你可以单独运行这个子查询,替换T1.[ItemCode]为一个实际存在的商品编码,比如:
select Quantity from drf1 drf inner join OITM itm on drf.[ItemCode] = itm.[ItemCode] where drf.[ItemCode] = '你的商品编码示例'
如果返回多行,就确认了问题根源。
修复方案
根据你的业务需求选择以下方式之一:
- 如果需要统计该商品的总Quantity,使用
sum()聚合:(select sum(Quantity) from drf1 drf inner join OITM itm on drf.[ItemCode] = itm.[ItemCode] where drf.[ItemCode] = T1.[ItemCode]) - 如果只需要某一行的Quantity,添加
TOP 1并指定排序逻辑(比如最新的记录):(select TOP 1 Quantity from drf1 drf inner join OITM itm on drf.[ItemCode] = itm.[ItemCode] where drf.[ItemCode] = T1.[ItemCode] order by drf.某个日期字段 desc) - 或者使用
max()/min()取极值,根据业务场景选择。
额外注意事项
原SQL还有两处拼写错误需要修正:
WhsCode in ('KHI-04', 'KHI12', 'LHR-01', 'RWP-O1')中的KHI12应该改为KHI-12,RWP-O1应该改为RWP-01,否则会漏掉部分仓库的数据。- 第二个子查询末尾缺少闭合的
),需要补上。
内容的提问来源于stack exchange,提问作者Hafiz Daniyal
相关产品推荐
相关产品推荐

