Dalam Oracle, anda boleh menggunakan klausa where dengan rownum untuk menanyakan sepuluh rekod pertama The where clause digunakan untuk mengehadkan syarat pertanyaan, dan rownum digunakan untuk mengehadkan jumlah bilangan baris yang dikembalikan untuk. pertanyaan. Sintaks ialah "pilih * dari Nama jadual di mana rownum <=10".
Persekitaran pengendalian tutorial ini: sistem Windows 10, versi Oracle 11g, komputer Dell G3.
Bagaimana untuk menanyakan 10 rekod teratas dalam jadual dalam Oracle?
select * from test where rownum <=10
Berikut ialah pengenalan kepada rownum
Penggunaan Rownum dan row_number() over()
ROWNUM ialah lajur pseudo yang disediakan oleh Oracle bermula dari 8 . Nomborkan hasil daripada SQL, sentiasa bermula dari 1. Kegunaan biasa adalah untuk mengeluarkan dalam halaman
Contohnya,
SELECT * FROM torderdetail a WHERE ROWNUM <= 10
Pernyataan ini adalah untuk mengeluarkan 10 rekod pertama, di sini. Tujuannya adalah serupa dengan bahagian atas sql sever, tetapi rownum harus dikatakan lebih berkuasa untuk output julat nombor yang ditentukan
SELECT * FROM (SELECT a.*, ROWNUM rn FROM torderdetail a) WHERE rn >= 10 AND rn <= 20
Pernyataan ini adalah untuk mengeluarkan rekod ke-10 hingga ke-20 mengapa rownum rn digunakan di sini , adalah untuk menukar rownum menjadi contoh, kerana rownum itu sendiri hanya boleh menggunakan kaedah perbandingan <= dan hanya boleh ditukar kepada lajur sebenar, supaya >= perbandingan boleh dilakukan.
Dalam aplikasi praktikal, selalunya diperlukan untuk mendapatkan rekod terkini, yang memerlukan mengisih rekod dahulu dan kemudian mendapatkan rownum <=
Yang biasa digunakan
SELECT * FROM (SELECT a.* FROM torderdetail a ORDER BY order_date DESC) WHERE ROWNUM <= 10
Terdapat perbincangan dalam CSDN Berkenaan 10 rekod terdekat, seseorang memberikan kenyataan sedemikian
SELECT a.* FROM torderdetail a WHERE ROWNUM <= 10 ORDER BY order_date DESC
Sebab mengapa kenyataan sedemikian muncul terutamanya dari perspektif kecekapan keseluruhan jadual, kemudian susun, dan kemudian ambil 10 rekod Pernyataan terakhir tidak akan mengimbas keseluruhan jadual, tetapi hanya akan mengambil 10 rekod Jelas sekali, kecekapan pernyataan terakhir akan lebih tinggi.
Kemudian mengapakah terdapat pertikaian? Keputusan mengeluarkan kedua-dua pesanan adalah betul-betul bertentangan Pengisihan dahulu dan kemudian mengambil 10 rekod akan mengambil 10 rekod terbaharu dan mengambil 10 rekod dahulu dan kemudian mengisih akan mengeluarkan 10 rekod yang terawal. Untuk kenyataan ini, secara amnya dipercayai bahawa perintah pelaksanaan adalah untuk mengambil 10 rekod dahulu dan kemudian mengisihnya. Jadi kenyataan ini sepatutnya menjadi ralat. Tetapi ini sebenarnya tidak berlaku. Perintah pelaksanaan pernyataan ini berkaitan dengan medan pesanan oleh Jika medan pesanan anda oleh adalah pk, ia diisih dahulu, dan kemudian 10 item diambil (lebih cepat daripada pernyataan pertama. ), dan medan pengisihan Apabila ia bukan PK, 10 item diambil dahulu dan kemudian diisih Pada masa ini, keputusan adalah berbeza daripada keperluan, jadi cara penulisan kedua mesti memastikan keputusan adalah betul apabila medan pengisihan. adalah kunci utama.
Fungsi analisis Row_number() over() telah disediakan sejak 9I Tujuan amnya adalah serupa dengan rownum.
Kaedah penulisan umum row_number() over(order by order_date desc) menjana susunan yang sama seperti pernyataan rownum, dan kecekapan adalah sama (untuk pernyataan rownum yang juga mempunyai susunan oleh), jadi dalam ini kes kedua-dua Penggunaan adalah sama.
Untuk mengambil 10 rekod terkini selepas pengumpulan, rownum tidak boleh mencapainya Pada masa ini, hanya row_number() over(partition by group order field by sorting field) boleh mencapai grouping Number, untuk. contoh, jika anda ingin mendapatkan 10 rekod pesanan terakhir setiap hari pada bulan lalu
SELECT * FROM (SELECT a.*, ROW_NUMBER () OVER (PARTITION BY TRUNC (order_date) ORDER BY order_date DESC) rn FROM torderdetail a) WHERE rn <= 10
Penggunaan alternatif Rownum, kadangkala kami akan menghadapi permintaan seperti ini, meminta untuk mengeluarkan semua hari bulan, ramai orang akan Bimbang, tidak ada jadual sedemikian dalam pangkalan data, bagaimana saya boleh mengeluarkan semua hari dalam sebulan? Ia boleh diselesaikan dengan rownum:
SELECT TRUNC (SYSDATE, 'MM') + ROWNUM - 1 FROM DUAL CONNECT BY ROWNUM <= TO_NUMBER (TO_CHAR (LAST_DAY (SYSDATE), 'dd'))
Tutorial yang disyorkan: "Tutorial Video Oracle"
Atas ialah kandungan terperinci Bagaimana untuk menanyakan 10 rekod pertama dalam oracle. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!