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

Bagaimana ROWNUM bekerja dalam kueri pagination?

Anda memiliki 4 pertanyaan, dan semuanya berkisar pada penggunaan dan fungsionalitas ROWNUM . Saya akan menjawab setiap pertanyaan satu per satu.

Mengapa (ini adalah upaya pertama saya sampai saya mencari di SO) Pilih * Dari Orang Dimana rownum> 100 dan rownum <110; mengembalikan 0 baris ?

Penjelasan bagus dari Thomas Kyte tentang ROWNUM dan pagination di sini.

Sebuah ROWNUM nilai ditetapkan ke baris setelah melewati fase predikat kueri tetapi sebelum kueri melakukan penyortiran atau agregasi apa pun. Juga, nilai ROWNUM bertambah hanya setelah ditetapkan, itulah sebabnya kueri berikut tidak akan pernah mengembalikan baris:

select * 
  from t 
 where ROWNUM > 1;

Karena ROWNUM> 1 tidak benar untuk baris pertama, ROWNUM tidak maju ke 2. Oleh karena itu, tidak ada nilai ROWNUM yang lebih besar dari 1.

Mengapa tidak ada cara sederhana untuk melakukan sesuatu seperti Select ... FROM ... WHERE rownum ANTARA lowerBound DAN upperBound ?

Ya ada. Dari Oracle 12c seterusnya, Anda dapat menggunakan Pembatasan Baris Teratas . yang baru fitur. Lihat jawaban saya di sini.

Misalnya, kueri di bawah ini akan mengembalikan karyawan antara tertinggi ke-4 sampai gaji tertinggi ke-7 dalam urutan menaik:

SQL> SELECT empno, sal
  2  FROM   emp
  3  ORDER BY sal
  4  OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;

     EMPNO        SAL
---------- ----------
      7654       1250
      7934       1300
      7844       1500
      7499       1600

SQL>

Bagaimana cara menghilangkan kolom r dalam nilai yang dihasilkan?

Alih-alih select * , daftar nama kolom yang diperlukan di kueri luar. Untuk sering menggunakan kueri, membuat tampilan adalah aktivitas satu kali yang sederhana.

Atau, di SQL*Plus Anda dapat menggunakan NOPRINT memerintah. Itu tidak akan menampilkan nama kolom yang tidak ingin Anda tampilkan. Namun, itu hanya akan berfungsi di SQL*Plus.

Misalnya,

COLUMN column_name NOPRINT

Misalnya,

SQL> desc dept
 Name                                      Null?    Type
 ----------------------------------------- -------- ------------
 DEPTNO                                             NUMBER(2)
 DNAME                                              VARCHAR2(14)
 LOC                                                VARCHAR2(13)

SQL> COLUMN dname NOPRINT
SQL> COLUMN LOC NOPRINT
SQL> SELECT * FROM dept;

    DEPTNO
----------
        10
        20
        30
        40

SQL>

Apakah ini memastikan pagination yang benar?

Ya, jika Anda menulis kueri pagination dengan benar.

Misalnya,

SELECT val
FROM   (SELECT val, rownum AS rnum
        FROM   (SELECT val
                FROM   t
                ORDER BY val)
        WHERE rownum <= 8)
WHERE  rnum >= 5;

       VAL
----------
         3
         3
         4
         4

4 rows selected.

SQL>

Atau, gunakan fitur pembatas baris baru pada 12c seperti yang saya tunjukkan di atas.

Beberapa contoh bagus di sini.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengubah kata sandi dengan Oracle SQL Developer

  2. ORA-24408:tidak dapat menghasilkan nama grup server yang unik

  3. Kirim email dengan lampiran di Oracle D2k, Oracle Forms 10g, Oracle Forms 6i

  4. Pembilasan Kursor Tunggal

  5. klausa OVER di Oracle