Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Query dan Pagination Top-N di Oracle

Kueri N Teratas  dan Pagination adalah umum di aplikasi berbasis Web. Pengguna memasukkan serangkaian kriteria, yang menjalankan kueri dan kemudian mengizinkan pengguna mengklik tombol Sebelumnya dan Berikutnya untuk membuka halaman melalui kumpulan hasil. Untuk mencapai fungsionalitas paging ini, aplikasi harus bisa mendapatkan serangkaian baris tertentu dari kueri Database.

Mari kita lihat metode yang berbeda di Oracle untuk mencapai Top-N Query di Oracle dan Pagination di Oracle query

Pra 12c

(1) Menggunakan Klausa ROWNUM

Apa itu ROWNUM
Ini adalah kolom semu (bukan kolom sebenarnya) yang tersedia dalam kueri. ROWNUM akan diberi nomor 1, 2, 3, 4, … N , di mana N adalah jumlah baris dalam himpunan ROWNUM yang digunakan. Nilai ROWNUM tidak ditetapkan secara permanen ke baris .

Berikut adalah cara untuk mendapatkan 5 nilai teratas

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

Versi ini akan mengurutkan Dept berdasarkan penjualan secara turun dan kemudian mengembalikan lima catatan pertama yang ditemuinya (lima catatan teratas).
Untuk pagination di oracle , jika Anda menginginkan catatan 5 -10 dari urutan Dept berdasarkan desc penjualan maka lakukan ini.

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

Sintaks umumnya adalah

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

(2) Menggunakan fungsi analitik oracle ROW_NUMBER():Berperilaku mirip dengan kolom semu ROWNUM tetapi lebih fleksibel dan memiliki lebih banyak kemampuan

Berikut adalah cara untuk mendapatkan 5 nilai teratas

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

Berikut adalah kueri untuk Pagination

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;

Kueri N Teratas di atas akan mengembalikan catatan yang berbeda ketika dua hal terikat untuk tempat saat menggunakan kueri n teratas


(3) Menggunakan RANK() dan DENSE_RANK():Ini adalah fungsi analitik yang dapat digunakan untuk menghilangkan masalah yang disebutkan di atas
Berikut adalah cara untuk mendapatkan 5 nilai teratas menggunakan peringkat

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

Berikut adalah cara untuk mendapatkan 5 nilai teratas menggunakan density_rank

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

Dengan 12c

Fitur N Teratas :

Oracle Database 12c menyertakan dukungan untuk klausa FETCH FIRST/NEXT dan OFFSET standar ANSI—bersama-sama disebut klausa pembatas baris. Klausa ini memungkinkan Anda untuk dengan mudah mengambil catatan N pertama dari kumpulan hasil atau, sebagai alternatif, catatan N pertama setelah melewati kumpulan catatan, sehingga Anda dapat dengan mudah membuat halaman melalui kumpulan hasil

Kueri Top-N memungkinkan kita untuk mengambil N baris atas atau bawah dari set yang dipesan. Menggabungkan dua kueri Top-N memberi Anda kemampuan untuk membuka halaman melalui kumpulan yang dipesan

Contoh:

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;

Jika Anda melihat rencana pengoptimal untuk kueri di atas, masih menggunakan row_number() di bawah bungkus untuk melakukannya

Pagination juga dapat terjadi dengan fitur ini dengan menggunakan sintaks offset

– offset 10 baris ambil 10 baris pertama saja

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

– offset 10 baris hanya ambil 0,1 persen baris pertama

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

– offset 10 baris ambil 3 baris pertama dengan ikatan. Artinya, semua baris teratas dengan ikatan juga akan disertakan dalam hasil

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

Jika Anda memeriksa rencana pengoptimal dari kueri di atas, Anda akan menemukan pengoptimal menggunakan fungsi rank() seperti yang ditunjukkan di atas dalam kasus Pra 12c

Pembatasan
(1)Jika Anda memiliki pernyataan SELECT dengan FOR UPDATE, Anda tidak dapat menggunakannya.
(2)Pernyataan SELECT tidak dapat CURRVAL atau NEXTVAL dari urutan
(3) If kueri Tampilan Terwujud memiliki klausa ini, maka Anda tidak dapat melakukan penyegaran tambahan Tampilan Terwujud itu

Semoga Anda menyukai artikel tentang Kueri Top-N di Oracle dan Pagination di kueri Oracle. Harap berikan umpan balik

Juga Dibaca
Fungsi Utama di Oracle
Fungsi RANK di 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. Oracle membandingkan cap waktu dengan tanggal

  2. Membangun daftar nilai yang dipisahkan koma dalam pernyataan Oracle SQL

  3. Bagaimana cara mendapatkan kunci yang dihasilkan dari sisipan batch JDBC di Oracle?

  4. Cara Mendapatkan Kencan Kemarin di Oracle

  5. ORA-01008:tidak semua variabel terikat. Mereka terikat