2012-02-05 43 views
21

Tôi đang thực hiện một số phân trang, và tôi cần phải thực hiện một số truy vấn và nhận được kết quả định dạng cắt lát. ví dụ: Tôi cần phải nhận được tất cả các "top" hàng trong phạm vi 20N < x < 40N, vvchọn TOP N hàng từ một bảng

SELECT * FROM Reflow 
WHERE ReflowProcessID = somenumber 
ORDER BY ID DESC; 

và bây giờ tôi cần phải thực hiện của tôi trượt theo cột gọi là ID.

Mọi đề xuất như thế nào? Tôi cần chạy truy vấn của mình trên mysql, mssql và oracle.

+2

Xem mệnh đề 'LIMIT' http://dev.mysql.com/doc/refman/5.1/en/select.html –

+0

Tại sao lại là downvote? Tại sao không đưa bình luận của bạn vào một câu trả lời? Rất nhiều câu hỏi. – Matthias

+1

Tôi khá chắc chắn bạn sẽ không nhận được bất cứ điều gì làm việc trong tất cả 3. Bạn sẽ phải sử dụng 'rownum' trong Oracle. – Ben

Trả lời

36

Giả sử kích thước trang của bạn là 20 kỷ lục, và bạn muốn có được trang số 2, đây là cách bạn sẽ làm điều đó:

SQL server, Oracle:

SELECT * -- <-- pick any columns here from your table, if you wanna exclude the RowNumber 
FROM (SELECT ROW_NUMBER OVER(ORDER BY ID DESC) RowNumber, * 
     FROM Reflow 
     WHERE ReflowProcessID = somenumber) t 
WHERE RowNumber >= 20 AND RowNumber <= 40  

MySQL:

SELECT * 
FROM Reflow 
WHERE ReflowProcessID = somenumber 
ORDER BY ID DESC 
LIMIT 20 OFFSET 20 
15

Trong MySql, bạn có thể nhận được 10 dòng bắt đầu từ hàng 20 sử dụng:

SELECT * FROM Reflow 
WHERE ReflowProcessID = somenumber 
ORDER BY ID DESC 
LIMIT 10 OFFSET 20 --Equivalent to LIMIT 20, 10 
Các vấn đề liên quan