在Oracle中选择顶部N,"for update skip locked"

Syn*_*sso 6 sql oracle locking top-n

在Oracle中,我可以选择排序表中的前1条消息

select messageid from(
    select 
        messageid, 
        RANK() over (order by messageid asc) as msg_rank 
    from messages
) where msg_rank=1;
Run Code Online (Sandbox Code Playgroud)

正如我在上一个问题中发现的那样,我可以专门选择一行

select * from messages where rownum < 2 for update skip locked;
Run Code Online (Sandbox Code Playgroud)

但是我无法将这两个概念合并在一起

select messageid from(
    select 
        messageid, 
        RANK() over (order by messageid asc) as msg_rank 
    from messages
) where msg_rank=1 for update skip locked;

-- results in error
-- ORA-02014: cannot select FOR UPDATE from view with DISTINCT, GROUP BY, etc.
Run Code Online (Sandbox Code Playgroud)

如何通过readpast锁定选择前N个?

Thi*_*ilo 3

这行得通吗?

select messageid from messages 
    where messageid in (
       select messageid from(
         select 
          messageid, 
          RANK() over (order by messageid asc) as msg_rank 
          from messages
       ) where msg_rank=1
    )
  for update skip locked;
Run Code Online (Sandbox Code Playgroud)