2010-10-15 31 views
6

Trong Oracle, tôi có thể chọn 1 tin nhắn hàng đầu trong một bảng được sắp xếp vớiChọn N hàng đầu với "để cập nhật bỏ qua khóa" trong Oracle

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

Và như tôi phát hiện ra trong một previous question tôi có thể chọn một hàng độc quyền với

select * from messages where rownum < 2 for update skip locked; 

Tuy nhiên tôi không thể hợp nhất hai khái niệm này với nhau

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. 

Làm thế nào tôi có thể chọn thứ e top N với khóa readpast?

+0

Tôi nghĩ rằng bài viết trên blog này có một vài suy nghĩ liên quan: http://markjbobak.wordpress.com/2010/04/06/unintended-consequences/ –

Trả lời

2

Tính năng này có hoạt động không?

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; 
+0

Nếu nó được thực hiện theo hai bước, không phải là tôi giới thiệu một điều kiện chủng tộc tiềm năng? Tôi làm theo logic của bạn, nhưng tôi thấy khó mà tin rằng Oracle không thể làm những gì SQL Server có thể. – Synesso

+0

Truy vấn đó được thực hiện tốt. Tôi sẽ tiếp tục kiểm tra xem khóa có hoạt động như dự định không, nhưng có vẻ tốt. Cảm ơn! – Synesso

+0

Vâng, ngữ nghĩa của bỏ qua bị khóa có lẽ là một chút khôn lanh trong trường hợp này, ngay cả trên SQL Server. Tôi hy vọng truy vấn ở trên sẽ tìm thấy đầu tiên N thư và sau đó bỏ qua giữa chúng (để bạn có thể kết thúc với ít hơn N bản ghi). Và tôi không nghĩ rằng có một cách xung quanh đó nói chung (ngắn khóa toàn bộ bảng). – Thilo

Các vấn đề liên quan