Hasil yang diarahkan secara ringkas di Oracle
batas baris Oracle berbeza dari dialek SQL yang lebih mudah seperti MySQL. Walaupun MySQL menggunakan, Oracle menggunakan pseudocolumn LIMIT
. Walau bagaimanapun, secara langsung menggunakan ROWNUM
dalam klausa ROWNUM
sebelum WHERE
menghasilkan hasil yang tidak dapat diramalkan. ORDER BY
Cabaran: memerintahkan sebelum mengehadkan
Isu ini berpunca daripada penilaian ROWNUM
sebelum klausa . Ini bermakna anda tidak mendapat baris N teratas selepas menyusun; Sebaliknya, anda mendapat baris sewenang -wenangnya. ORDER BY
Penyelesaian: subqueries untuk kawalan tepat
untuk membatasi baris dengan betulselepas memesan, gunakan subquery:
<code class="language-sql">SELECT * FROM ( SELECT * FROM emp ORDER BY sal DESC ) WHERE ROWNUM <= 10;</code>
jadual mengikut gaji (emp
. sal
ROWNUM
Untuk kawalan yang lebih tepat, menentukan kedua -dua batas atas dan bawah memerlukan subqueries bersarang:
ini mengambil baris 21-30 (inklusif) selepas disusun mengikut gaji.
<code class="language-sql">SELECT * FROM ( SELECT a.*, ROWNUM rnum FROM ( SELECT * FROM emp ORDER BY sal DESC ) a WHERE ROWNUM <= 30 ) WHERE rnum >= 21;</code>
Oracle moden (12c dan kemudian): Sintaks mudah
versi Oracle 12c dan kemudian menawarkan pendekatan yang lebih bersih:
sintaks
<code class="language-sql">-- Top 10 results SELECT * FROM sometable ORDER BY name FETCH FIRST 10 ROWS ONLY; -- Rows 20-30 SELECT * FROM sometable ORDER BY name OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;</code>
ini jauh lebih mudah dibaca dan cekap untuk penomboran. Gunakan kaedah ini jika versi Oracle anda menyokongnya. FETCH FIRST
Atas ialah kandungan terperinci Bagaimana untuk Mengehadkan Keputusan Pertanyaan Oracle Selepas Memesan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!