Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

ROWNUM hoạt động như thế nào trong truy vấn phân trang?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để cấu hình DbContext để hoạt động với Oracle ODP.Net và EF CodeFirst?

  2. Cú pháp URL JDBC chính xác nếu sử dụng ví Oracle là gì?

  3. Cách định dạng số bằng dấu trừ / dấu cộng trong Oracle

  4. Làm cách nào để chọn tất cả các cột từ bảng, cùng với các cột bổ sung như ROWNUM?

  5. Lỗi Oracle .Net ManagedDataAccess:Không thể tải loại 'OracleInternal.Common.ConfigBaseClass' từ lắp ráp