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.