Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Truy vấn Top-N và Phân trang trong Oracle

Truy vấn Top-N và Phân trang phổ biến trong các ứng dụng dựa trên Web. Người dùng nhập một bộ tiêu chí, bộ tiêu chí này sẽ chạy một truy vấn và sau đó cho phép người dùng nhấp vào các nút Trước và Tiếp theo để chuyển sang trang thông qua bộ kết quả. Để đạt được chức năng phân trang này, ứng dụng cần có khả năng lấy một tập hợp các hàng nhất định từ truy vấn Cơ sở dữ liệu.

Hãy xem qua các phương pháp khác nhau trong Oracle để đạt được các Truy vấn Top-N trong Oracle và Phân trang trong truy vấn Oracle

Trước 12c

(1) Sử dụng Mệnh đề ROWNUM

ROWNUM là gì
Đây là một cột giả (không phải cột thực) có sẵn trong một truy vấn. ROWNUM sẽ được gán các số 1, 2, 3, 4,… N, trong đó N là số hàng trong tập hợp ROWNUM được sử dụng với. Giá trị ROWNUM không được chỉ định vĩnh viễn cho một hàng.

Đây là cách để có được 5 giá trị hàng đầu

SELECT *
FROM (SELECT *
FROM dept
ORDER BY sales DESC)
WHERE ROWNUM <= 5;

Phiên bản này sẽ sắp xếp Bộ phận theo doanh số giảm dần và sau đó trả về năm bản ghi đầu tiên mà nó gặp phải (năm bản ghi hàng đầu).
Đối với phân trang trong oracle, nếu bạn muốn có 5-10 bản ghi của Đơn hàng theo doanh số mô tả thì làm điều này.

SELECT a.*
FROM (SELECT ROWNUM rn, b.*
FROM ( SELECT *
FROM dept
ORDER BY sales dsc) b  where rn <=10) a
WHERE a.rn >= 5

Cú pháp chung sẽ là

select *
from
( select rownum rnum, a.*
from (your_query) a
where rownum <= M )
where rnum >= N;

(2) Sử dụng hàm phân tích tiên tri ROW_NUMBER ():Nó hoạt động tương tự như cột giả ROWNUM nhưng linh hoạt hơn và có nhiều khả năng hơn

Đây là cách để có được 5 giá trị hàng đầu

SELECT *
FROM (SELECT d.*,row_number() over (ORDER BY d.sales DSC) rn
FROM dept d
)
WHERE rn <= 5;

Đây là truy vấn cho Phân trang

SELECT * FROM (
SELECT
d.*,
row_number() over (ORDER BY d.sales DSC) rn
FROM dept d) WHERE rn BETWEEN 0 AND 5 ORDER BY rn;

N truy vấn hàng đầu ở trên sẽ trả về các bản ghi khác nhau khi có hai thứ gắn liền với nhau khi sử dụng n truy vấn hàng đầu


(3) Sử dụng RANK () và DENSE_RANK ():Đây là các hàm phân tích có thể được sử dụng để loại bỏ vấn đề đã nêu ở trên
Đây là cách để lấy 5 giá trị hàng đầu bằng cách sử dụng xếp hạng

SELECT *
FROM (SELECT d.*,rank() over (ORDER BY d.sales DSC) rn
FROM dept d
)
WHERE rn <= 5;

Đây là cách để có được 5 giá trị hàng đầu bằng cách sử dụng secure_rank

SELECT *
FROM (SELECT d.*,dense_rank() over (ORDER BY d.sales DSC) rn
FROM dept d
)
WHERE rn <= 5;

Với 12c

Tính năng Top-N :

Cơ sở dữ liệu Oracle 12c bao gồm hỗ trợ cho các mệnh đề FETCH FIRST / NEXT và OFFSET theo tiêu chuẩn ANSI — được gọi chung là mệnh đề giới hạn hàng. Mệnh đề này cho phép bạn dễ dàng truy xuất N bản ghi đầu tiên từ một tập kết quả hoặc N bản ghi đầu tiên sau khi bỏ qua một tập hợp các bản ghi, vì vậy bạn có thể dễ dàng phân trang thông qua một tập kết quả

Truy vấn Top-N cho phép chúng ta truy xuất N hàng trên cùng hoặc dưới cùng từ một tập hợp có thứ tự. Việc kết hợp hai truy vấn Top-N mang lại cho bạn khả năng duyệt trang thông qua một tập hợp có thứ tự

Ví dụ:

SELECT value
FROM mytable
ORDER BY value DESC
FETCH FIRST 10 ROWS ONLY;  

select * from my_test order by name fetch first 3 rows only;

Nếu bạn nhìn vào kế hoạch trình tối ưu hóa cho truy vấn trên, nó vẫn đang sử dụng row_number () để thực hiện nó

Việc phân trang cũng có thể xảy ra với tính năng này với cú pháp bù đắp sử dụng

- bù đắp 10 hàng chỉ tìm nạp 10 hàng đầu tiên

select * from my_test order by id
offset 10 rows fetch next 10 rows only;

- bù đắp 10 hàng chỉ tìm nạp 0,1 phần trăm hàng đầu tiên

select * from my_test order by id offset 10 rows first 0.1 percent rows only;

- bù đắp 10 hàng tìm nạp 3 hàng đầu tiên có mối quan hệ. Nó có nghĩa là tất cả các hàng trên cùng có mối ràng buộc cũng sẽ được bao gồm trong kết quả

select * from my_test order by name fetch first 3 rows with ties;

Nếu bạn kiểm tra kế hoạch trình tối ưu hóa của truy vấn trên, bạn sẽ thấy trình tối ưu hóa đang sử dụng hàm rank () như được minh họa ở trên trong trường hợp Pre 12c

Hạn chế
(1) Nếu bạn có câu lệnh SELECT với FOR UPDATE, bạn không thể sử dụng nó.
(2) Câu lệnh SELECT không thể CURRVAL hoặc NEXTVAL của chuỗi
(3) Nếu truy vấn của Chế độ xem được vật chất hóa có mệnh đề này, khi đó bạn không thể thực hiện làm mới gia tăng Chế độ xem được vật chất hóa đó

Hy vọng bạn thích bài viết về Truy vấn Top-N trong oracle và Phân trang trong truy vấn oracle. Vui lòng cung cấp phản hồi

Cũng đã đọc
Hàm Lead trong Oracle
Hàm RANK trong Oracle
https://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqljoffsetfetch.html


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 9 truy vấn máy in ứng dụng Oracle hữu ích hàng đầu

  2. Oracle:tính duy nhất chọn lọc chỉ mục dựa trên hàm

  3. Làm thế nào để xác thực số thẻ tín dụng và xác định loại thẻ bằng PL / SQL?

  4. Quá trình nâng cấp từng bước lên R12.2 Nâng cấp phần -2 (Trình điều khiển Nâng cấp Chính cho R12.2.0)

  5. Làm thế nào để hồi tưởng lại khi chúng ta có thẻ dữ liệu