替换 H2 中的 TOP 1 SQL 它适用于 Oracle

Replace TOP 1 in H2 SQL that it works with Oracle

我有这个 SQL 用于 H2 数据库:

update EVENT event
set event.SENT_INTO_WF_BY_ID = (
  select TOP 1 eventRev.USER_ID
  from EVENT_REV eventRev
  where eventRev.EVENT_ID = event.EVENT_ID
  and eventRev.STATUS != (
    select TOP 1 eventRev2.STATUS
    from EVENT_REV eventRev2
    where VALID_FROM is not null
    and eventRev.EVENT_ID = eventRev2.EVENT_ID
    order by VALID_FROM asc
  )
  order by eventRev.VALID_TO asc nulls last
)
where event.SENT_INTO_WF_BY_ID is null

我必须翻译它才能使其适用于 Oracle。在 Oracle 中 "TOP" 不存在,所以我尝试了这个:

update EVENT event
set event.SENT_INTO_WF_BY_ID = (
  select eventRev.USER_ID
  from ( select eventRev.USER_ID from EVENT_REV eventRev
         where eventRev.EVENT_ID = event.EVENT_ID
         order by eventRev.VALID_TO asc nulls last )
  where rownum = 1

)
where event.SENT_INTO_WF_BY_ID is null;

但这给了我错误:

Error: ORA-00904: "event"."EVENT_ID": invalid identifier

有没有没有更多嵌套选择的解决方案?

您可以使用 merge,但是有一种方法可以使用 update 来解决这个问题。那就是使用 keep 功能:

update EVENT e
    set e.SENT_INTO_WF_BY_ID = 
          (select max(er.USER_ID) keep (dense_rank first order by er.VALID_TO asc nulls last)
           from EVENT_REV er
           where er.EVENT_ID = e.EVENT_ID
          )
    where e.SENT_INTO_WF_BY_ID is null;

您遇到的问题是因为 Oracle 中的范围规则。 Oracle 只识别来自外部查询的别名,深度为一层。