Oracle SQL中row_number()用法及子查询多列返回报错排查求助
解决SQL报错并实现预期报表输出
报错原因分析
你遇到的SQLCODE=-412错误根源很清晰:作为列表达式的子查询返回了多列(EE.REMARKS和row_number()),但数据库要求这类子查询只能返回单个列。你把这个多列子查询赋值给了SIR列,数据库无法处理这种情况,因此抛出了错误。
修正后的SQL实现
我们可以简化查询逻辑,直接关联两张表并过滤条件,再用LISTAGG聚合合并目标字段。具体代码如下:
SELECT ES.SHPMNT_REF AS "House B/L #", LISTAGG(EE.REMARKS, ',') WITHIN GROUP (ORDER BY EE.REMARKS) AS "REMARKS(from SIR Event)" FROM BRDB.EXPORT_SHIPMENT ES JOIN BRDB.EXPORT_EVENT EE ON ES.SHPMNT_REF = EE.FILE_NO WHERE ES.SHIPMENT_TYPE = 'EHO' -- 仅筛选SHIPMENT_TYPE为EHO的运单 AND EE.EVENT_CODE = 'SIR' -- 仅筛选SIR类型的事件记录 GROUP BY ES.SHPMNT_REF ORDER BY ES.SHPMNT_REF;
代码细节说明
- 表关联:用
JOIN直接关联EXPORT_SHIPMENT和EXPORT_EVENT,关联条件为SHPMNT_REF = FILE_NO,比嵌套子查询更简洁高效。 - 过滤逻辑:
ES.SHIPMENT_TYPE = 'EHO':确保只处理你目标范围内的运单类型。EE.EVENT_CODE = 'SIR':仅保留SIR事件的记录,自动排除像789号运单的EEO事件数据。
- 聚合合并:
LISTAGG(EE.REMARKS, ',')将同一运单下的所有REMARKS用逗号拼接,WITHIN GROUP (ORDER BY EE.REMARKS)保证拼接顺序(你也可以替换成事件时间等其他字段,若表中有相关字段)。 - 分组排序:按
SHPMNT_REF分组,确保每个运单对应一条合并后的记录,最后按运单号排序让结果更规整。
预期输出验证
执行该查询后,会得到你想要的结果:
FILE NO | REMARKS
123 | TEST0,TEST1,TEST2
456 | TEST3
内容的提问来源于stack exchange,提问作者CK Ang
相关产品推荐
相关产品推荐

