Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak ROWNUM działa w zapytaniu o paginację?

Masz 4 pytania, a wszystkie dotyczą użycia i funkcjonalności ROWNUM . Odpowiem na każde pytanie jeden po drugim.

Dlaczego (to była moja pierwsza próba, dopóki nie wyszukałem SO) Wybierz * Od osoby Gdzie rownum> 100 i rownum <110; zwraca 0 wierszy ?

Ładne wyjaśnienie Thomasa Kyte dotyczące ROWNUM i paginacji tutaj.

ROWNUM wartość jest przypisywana do wiersza po przejściu przez fazę predykatu zapytania, ale zanim zapytanie wykona jakiekolwiek sortowanie lub agregację. Ponadto wartość ROWNUM jest zwiększana dopiero po jej przypisaniu, dlatego następujące zapytanie nigdy nie zwróci wiersza:

select * 
  from t 
 where ROWNUM > 1;

Ponieważ ROWNUM> 1 nie jest prawdziwe dla pierwszego wiersza, ROWNUM nie zwiększa się do 2. W związku z tym żadna wartość ROWNUM nigdy nie może być większa niż 1.

Dlaczego nie ma prostego sposobu na zrobienie czegoś takiego jak Select ... FROM ... GDZIE rownum BETWEEN lowerBound AND upperBound ?

Tak jest. Od Oracle 12c i dalej, możesz użyć nowego ograniczenia Top-n Row funkcja. Zobacz moją odpowiedź tutaj.

Na przykład poniższe zapytanie zwróci pracowników między 4 od najwyższej do 7 najwyższego wynagrodzenia w porządku rosnącym:

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>

Jak pozbyć się kolumny r w otrzymanych wartościach?

Zamiast select * , wymień wymagane nazwy kolumn w zapytaniu zewnętrznym. W przypadku częstego używania zapytania tworzenie widoku jest prostą jednorazową czynnością.

Alternatywnie, w SQL*Plus możesz użyć NOPRINT Komenda. Nie wyświetli nazwy kolumny, której nie chcesz wyświetlać. Jednak działałoby to tylko w SQL*Plus.

Na przykład

COLUMN column_name NOPRINT

Na przykład

Opis działu
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>

Czy zapewnia prawidłową paginację?

Tak, jeśli poprawnie wpiszesz zapytanie dotyczące stronicowania.

Na przykład

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>

Lub użyj nowej funkcji ograniczania wierszy na 12c, jak pokazano powyżej.

Kilka dobrych przykładów tutaj.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle — widok zmaterializowany nadal dostępny po całkowitym odświeżeniu. Jak to działa?

  2. Jak wyświetlić listę aktywnych/otwartych połączeń w Oracle?

  3. 9 najczęściej zadawanych zapytań dotyczących drukarek Oracle Apps

  4. TO_DATE() Funkcja w Oracle

  5. Lekki dla Oracle