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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:04:18