Выберите top N с помощью" FOR update skip locked " в Oracle

в Oracle я могу выбрать первое сообщение 1 в отсортированной таблице с

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

и, как я обнаружил в предыдущий вопрос Я могу выбрать строку исключительно с

select * from messages where rownum < 2 for update skip locked;
Я не могу объединить эти два понятия вместе
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.

как я могу выбрать верхний N с блокировкой readpast?

1 ответов


будет ли это работать?

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;