Oracle ROWNUM dan Penomboran: Isu dan Penyelesaian Biasa
Artikel ini menangani cabaran yang kerap dihadapi apabila menggunakan ROWNUM
untuk penomboran dalam Oracle SQL.
Masalah 1: Tidak Berkesan WHERE
Klausa dengan ROWNUM
Mengapa SELECT * FROM Person WHERE rownum > 100
tidak mengembalikan hasil?
ROWNUM
diberikan selepas fasa penapisan (predikat) awal. Oleh kerana nilai ROWNUM
hanya dinaikkan selepas tugasan, nilai yang lebih besar daripada 1 tidak boleh dipilih secara langsung menggunakan klausa WHERE
dengan cara ini. Tiada baris memenuhi syarat ROWNUM > 100
.
Masalah 2: ROWNUM BETWEEN
Had
Mengapa WHERE rownum BETWEEN lowerBound AND upperBound
tidak sesuai untuk penomboran?
Sintaks ini juga tidak berkesan kerana tugasan ROWNUM
mendahului penilaian klausa WHERE
. Oracle tidak boleh terus memilih julat ROWNUM
nilai.
Penyelesaian: Oracle 12c and Beyond (Penghadan Baris Atas-n)
Oracle 12c memperkenalkan pendekatan unggul: "Penghadan Baris Atas-n" menggunakan OFFSET
dan FETCH
. Contohnya:
<code class="language-sql">SELECT empno, sal FROM emp ORDER BY sal OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;</code>
Ini dengan cekap mendapatkan semula baris 5-8 (offset 4, ambil 4). Kaedah ini lebih diutamakan daripada teknik bergantung semata-mata pada ROWNUM
.
Masalah 3: Menyembunyikan ROWNUM
Lajur
Bagaimanakah kita boleh menghalang lajur ROWNUM
daripada muncul dalam set hasil?
Cuma senaraikan hanya lajur yang diingini dalam pernyataan SELECT
luar. Sebagai alternatif, dalam SQL*Plus, anda boleh menggunakan perintah NOPRINT
untuk menyekat output lajur tertentu.
Masalah 4: Memastikan Penomboran Betul dengan ROWNUM
(Versi Oracle Lama)
Bolehkah ROWNUM
mencapai penomboran yang betul?
Ya, tetapi ia memerlukan struktur pertanyaan bersarang:
<code class="language-sql">SELECT val FROM (SELECT val, rownum AS rnum FROM (SELECT val FROM t ORDER BY val) WHERE rownum <= 8) WHERE rnum >= 5;</code>
Ini mendapatkan semula baris 5-8 dengan betul. Pertanyaan dalam memberikan ROWNUM
, penapis pertanyaan tengah berdasarkan sempadan atas dan penapis pertanyaan luar berdasarkan sempadan bawah. Walau bagaimanapun, kaedah OFFSET
/FETCH
kekal sebagai pilihan yang lebih cekap dan boleh dibaca dalam Oracle 12c dan lebih baru.
Atas ialah kandungan terperinci ROWNUM dalam Oracle: Bagaimana untuk Mencapai Penomboran yang Betul dan Mengelakkan Perangkap Biasa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!