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