ORA-01427错误排查:OTBI SQL子查询返回多行问题求助
解决ORA-01427: single-row subquery returns more than one row错误
错误原因
你遇到的ORA-01427错误,是因为定义item的子查询中存在同一个inventory_item_id对应多条物料编号记录的情况。当主查询通过pla.item_id = item.inventory_item_id(+)外连接时,单行采购订单行(po_lines_all)会匹配到多行物料记录,触发Oracle的单行子查询限制。
最小改动解决方案
要在最小改动的前提下获取所有关联物料编号,可根据业务需求选择以下方案:
方案1:去重获取唯一物料编号(推荐,改动最小)
用GROUP BY+聚合函数确保每个物料ID对应唯一物料编号,比如取最大编号:
,(select max(esiav.item_number) as item_number, esiav.inventory_item_id FROM egp_system_items_b esiav, inv_org_parameters IOP WHERE ESIAV.organization_id = IOP.organization_id AND IOP.organization_code='WSH_ITEMMSTR' GROUP BY esiav.inventory_item_id) item
方案2:保留所有物料编号(若业务需要全部关联编号)
如果需要返回同一个物料ID对应的所有物料编号,只需去掉主查询的DISTINCT(此时表连接逻辑不会触发ORA-01427):
SELECT item.item_number item_number -- 移除DISTINCT关键字
验证步骤
可单独执行以下查询,确认item子查询中是否存在重复的物料ID:
SELECT inventory_item_id, COUNT(*) FROM ( SELECT esiav.item_number, esiav.inventory_item_id FROM egp_system_items_b esiav, inv_org_parameters IOP WHERE ESIAV.organization_id = IOP.organization_id AND IOP.organization_code='WSH_ITEMMSTR' ) GROUP BY inventory_item_id HAVING COUNT(*) > 1;
该查询会返回所有存在重复的物料ID,帮助你定位数据问题。
内容的提问来源于stack exchange,提问作者Juan E Rojas Rodriguez
相关产品推荐
相关产品推荐

