繁体   English   中英

如何在Oracle SQL中使用row_number()

[英]How to use row_number() in Oracle SQL

运行下面的代码时收到错误-以下示例供您参考。

BRDB.EXPORT SHIPMENT(数据库表)

 SHPMNT_REF  | SHIPMENT_TYPE
    123      | EHO
    456      | EHO
    789      | EHO

BRDB.EVENT_CODE(数据库表)

 FILE_NO  | REMARKS   EVENT_CODE
 123      | TEST0      SIR
 123      | TEST1      SIR
 123      | TEST2      SIR
 456      | TEST3      SIR
 789      | TEST4      EEO

我想在报告中显示的是

  FILE NO    |  REMARKS
     123     |  TEST0,TEST1,TEST2
     456     |  TEST3

下面是我的编码

select min(X.SHPMNT_REF) as "House B/L #",
       listagg(case when SIR = 1 then X.REMARKS end, ',') within group (order by X.SHPMNT_REF) as "REMARKS(from SIR Event)"
FROM   (select ES.SHPMNT_REF,
               (select EE.REMARKS,
                       row_number() over (order by EE.FILE_NO)
                FROM   BRDB.EXPORT_EVENT EE
                where  EE.FILE_NO = ES.SHPMNT_REF
                and    EE.EVENT_CODE = 'SIR') as SIR
        from   BRDB.EXPORT_SHIPMENT ES)X
GROUP BY X.SHPMNT_REF

以下是我收到的错误。

Multiple columns are returned from a subquery that is allowed only one column.. SQLCODE=-412, SQLSTATE=42823, DRIVER=4.19.49. 2) [Code: -727, SQL State: 56098]  An error occurred during implicit system action type "2". Information returned for the error includes SQLCODE "-412", SQLSTATE "42823" and message tokens "".

我知道您想要的是:

select ec.file_no,
       listagg(ec.remarks, ',') within group (order by ec.remarks) remarks
from event_code ec
where (ec.file_no, ec.event_code) not in
           (select SHPMNT_REF, SHIPMENT_TYPE
            from BRDB.EXPORT SHIPMENT
           )
      )
group by ec.file_no;

我看不到row_number()与您指定的结果有什么关系。

(select EE.REMARKS,
row_number() over (order by EE.FILE_NO) 
FROM BRDB.EXPORT_EVENT EE where EE.FILE_NO = ES.SHPMNT_REF 
                            and EE.EVENT_CODE = 'SIR'
) as Sir

此上层查询返回多列,但您使用的是Sir ,这是不正确的,因此返回了错误

您可以使用联接替换子查询

select 
min(X.SHPMNT_REF) as "House B/L #",

listagg(case when SIR = 1 then X.REMARKS
end, ',') within group (order by X.SHPMNT_REF) as "REMARKS(from SIR Event)"

FROM
(select
ES.SHPMNT_REF,

row_number() over (order by EE.FILE_NO)  
  as SIR

from BRDB.EXPORT_SHIPMENT ES join BRDB.EXPORT_EVENT EE
on EE.FILE_NO = ES.SHPMNT_REF where EE.EVENT_CODE = 'SIR'
)X
GROUP BY X.SHPMNT_REF

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM