替换 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 只识别来自外部查询的别名,深度为一层。
我有这个 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 只识别来自外部查询的别名,深度为一层。