Bạn có 4 câu hỏi và tất cả đều xoay quanh việc sử dụng và chức năng của ROWNUM . Tôi sẽ trả lời từng câu hỏi một.
Tại sao (đây là lần thử đầu tiên của tôi cho đến khi tôi tìm kiếm trên SO) Chọn * Từ Người Ở đâu rownum> 100 và rownum <110; trả về 0 hàng?
Thomas Kyte giải thích tốt về ROWNUM và phân trang ở đây.
A ROWNUM giá trị được chỉ định cho một hàng sau khi nó vượt qua giai đoạn vị từ của truy vấn nhưng trước khi truy vấn thực hiện bất kỳ phân loại hoặc tổng hợp nào. Ngoài ra, giá trị ROWNUM chỉ được tăng lên sau khi nó được chỉ định, đó là lý do tại sao truy vấn sau sẽ không bao giờ trả về một hàng:
select *
from t
where ROWNUM > 1;
Vì ROWNUM> 1 không đúng với hàng đầu tiên, ROWNUM không tăng lên 2. Do đó, không giá trị ROWNUM nào lớn hơn 1.
Tại sao không có cách đơn giản nào để thực hiện một số việc như Chọn ... TỪ ... ĐÂU rownum GIỮA Ràng buộc dưới và Giới hạn trên?
Có, có. Từ Oracle 12c trở đi, bạn có thể sử dụng Giới hạn hàng trên cùng mới tính năng. Xem câu trả lời của tôi tại đây.
Ví dụ:truy vấn dưới đây sẽ trả về các nhân viên nằm trong khoảng cao thứ 4 cho đến mức lương cao thứ 7 theo thứ tự tăng dần:
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>
Làm thế nào để loại bỏ cột r trong các giá trị kết quả?
Thay vì select *
, liệt kê các tên cột bắt buộc trong truy vấn bên ngoài. Đối với việc thường xuyên sử dụng truy vấn, việc tạo chế độ xem là một hoạt động đơn giản một lần.
Ngoài ra, trong SQL*Plus
bạn có thể sử dụng NOPRINT yêu cầu. Nó sẽ không hiển thị tên cột mà bạn không muốn hiển thị. Tuy nhiên, nó sẽ chỉ hoạt động trong SQL * Plus.
Ví dụ,
COLUMN column_name NOPRINT
Ví dụ,
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>
Nó có đảm bảo phân trang chính xác không?
Có, nếu bạn viết truy vấn phân trang chính xác.
Ví dụ,
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>
Hoặc, sử dụng tính năng giới hạn hàng mới trên 12c như tôi đã trình bày ở trên.
Vài ví dụ điển hình ở đây.