2012-03-13 33 views
6

Tôi có truy vấn sau đây:Tại sao = toán tử không hoạt động với ROWNUM ngoài giá trị 1?

select * from abc where rownum = 10 

Output: Không có dữ liệu để hiển thị

tôi chắc chắn có nhiều hơn 25 bản ghi trong bảng abc và mục tiêu của tôi là để hiển thị các bản ghi thứ n.

Nếu tôi viết các truy vấn như: -

select * from abc where rownum = 1 

nó hoạt động tốt và mang lại cho tôi những kỷ lục đầu tiên. Không phải bất kỳ bản ghi nào khác ngoài bản ghi đầu tiên.

Bất kỳ ý tưởng nào?

Trả lời

18

Vì số hàng được gán tuần tự cho các hàng được tìm nạp được trả lại.

Đây là cách hoạt động của tuyên bố của bạn. Nó lấy hàng ứng cử viên đầu tiên và tạm thời cho nó hàng số 1, mà không phù hợp với điều kiện của bạn vì vậy nó bị vứt bỏ.

Sau đó, bạn nhận được hàng ứng viên thứ hai và đó là cũng được cung cấp số thứ tự 1 (kể từ khi số trước đó bị loại bỏ). Nó không khớp.

Sau đó, hàng ứng cử viên thứ ba ... tốt, tôi chắc chắn bạn có thể thấy nơi này đang diễn ra. Tóm lại, bạn sẽ không bao giờ tìm thấy một hàng thỏa mãn điều kiện đó.

Số hàng chỉ hữu ích cho = 1, < something hoặc <= something.

Điều này được giải thích trong Oracle docs for the rownum pseudo-column.

Bạn cũng nên nhớ rằng SQL là một đại số quan hệ trả về các tập hợp không có thứ tự trừ khi bạn chỉ định một đơn đặt hàng. Điều đó có nghĩa là hàng số mười có thể là một cái gì đó bây giờ và cái gì khác trong ba phút.

Nếu bạn muốn có một (kludgy, thừa nhận) cách để có được hàng thứ n, bạn có thể sử dụng một cái gì đó tương tự (ví hàng thứ năm):

select * from (
    select * from (
     select col1, col2, col3 from tbl order by col1 asc 
    ) where rownum < 6 order by col1 desc 
) where rownum = 1 

Các bên chọn sẽ đảm bảo bạn có một trật tự phù hợp trên truy vấn trước khi bạn bắt đầu vứt bỏ các hàng và lựa chọn ở giữa sẽ vứt bỏ tất cả trừ năm hàng đầu tiên từ đó và cũng đảo ngược thứ tự.

Lựa chọn bên ngoài sau đó sẽ chỉ trả lại hàng đầu tiên của tập hợp đảo ngược (là hàng cuối cùng của tập hợp năm hàng khi nó được đặt theo thứ tự tăng dần).

Cách tốt hơn có lẽ là:

select * from (
    select rownum rn, col1, col2, col3 from tbl order by col1 
) where rn = 5 

này hoạt động bằng cách lấy tất cả mọi thứ và giao rownum đến một cột "thực", sau đó sử dụng con số cột thực để lọc các kết quả.

+0

Cảm ơn rất nhiều. Bạn có thể đề nghị thay thế nào để đáp ứng mục tiêu của tôi không? Tức là, hiển thị bản ghi thứ n nếu tôi biết giá trị của n? –

+0

Cảm ơn bạn rất nhiều.Tài liệu Oracle nói điều này: UPDATE my_table SET column1 = ROWNUM; Tốt hơn, tôi sẽ có một cột thật trong bảng và sau đó lọc kết quả theo đó. :) –

+1

@SaharHassan, vấn đề duy nhất với điều đó là bạn cần phải duy trì nó. Nói cách khác, có thể bạn sẽ phải có trình kích hoạt hoặc cột tăng tự động. Nhưng không ai trong số đó giúp với thực tế là tập hợp kết quả vốn dĩ _unsorted_ trừ khi bạn đặt hàng chúng một cách rõ ràng. – paxdiablo

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