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

Misteri rownum di oracle

ROWNUM aneh karena dapat dievaluasi sebagai bagian dari kondisi dalam kueri - tetapi jika baris gagal melewati filter itu, ROWNUM nilai yang ditetapkan menjadi tersedia untuk digunakan lagi untuk baris berikutnya.

Salah satu efek penting dari ini adalah jika Anda menggunakan kondisi apa pun yang mengecualikan ROWNUM nilai 1, Anda tidak akan pernah mendapatkan kecocokan. Baris pertama yang akan diuji terhadap kondisi ini adalah baris 1; tetapi kemudian akan gagal dalam tes, sehingga baris berikutnya akan dianggap sebagai baris 1; dan seterusnya.

Jadi kondisi Anda ROWNUM BETWEEN 2 AND 4 tidak akan pernah benar.

Solusi yang Anda temukan adalah yang tradisional. Cara lainnya adalah menggunakan fungsi analitik untuk memberi peringkat pada baris, lalu memfilter peringkat tersebut, mis.:

SELECT MI.* FROM (
  SELECT USER_ID,CUSTOMER_NAME, RANK() OVER (ORDER BY CREATION_DATE DESC) AS the_rank
  FROM ELEC_AUTO_MERC 
  ) MI
WHERE the_rank BETWEEN 2 AND 4;

Beberapa fungsi analitik - RANK, DENSE_RANK, dan ROW_NUMBER - dapat digunakan untuk tujuan ini, dan akan menghasilkan hasil yang sedikit berbeda, terutama jika ada ikatan. Lihat dokumennya.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kebuntuan di Oracle

  2. SQL Oracle - Menggabungkan baris berurutan dengan filter

  3. Konfigurasikan Hibernate untuk menggunakan Oracle's SYS_GUID() untuk Primary Key

  4. Pilih vokal dari varchar, Oracle PL/SQL

  5. Ambil nilai yang berbeda dengan LISTAGG di Oracle 12C