Oracle
 sql >> база данни >  >> RDS >> Oracle

Как работи ROWNUM в заявка за пагинация?

Имате 4 въпроса и всички се въртят около използването и функционалността на ROWNUM . Ще отговоря на всеки въпрос един по един.

Защо (това беше първият ми опит, докато не потърсих в SO) Изберете * От човек Където rownum> 100 и rownum <110; връща 0 реда?

Хубаво обяснение от Томас Кайт относно ROWNUM и пагинация тук.

AROWNUM стойност се присвоява на ред, след като премине предикатната фаза на заявката, но преди заявката да извърши някакво сортиране или агрегиране. Също така стойността ROWNUM се увеличава само след като е присвоена, поради което следната заявка никога няма да върне ред:

select * 
  from t 
 where ROWNUM > 1;

Тъй като ROWNUM> 1 не е вярно за първия ред, ROWNUM не преминава към 2. Следователно нито една стойност на ROWNUM никога не може да бъде по-голяма от 1.

Защо няма лесен начин да направите нещо като Избор ... ОТ ... КЪДЕ rownum МЕЖДУ lowBound AND upperBound ?

Да, има. От Oracle 12c нататък можете да използвате новото ограничение на най-горния ред отличителен белег. Вижте моя отговор тук.

Например, заявката по-долу ще върне служителите между 4-то най-високо до7-ма най-висока заплата във възходящ ред:

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>

Как да се отървем от колоната r в получените стойности?

Вместо select * , избройте задължителните имена на колони във външната заявка. За често използване на заявката създаването на изглед е проста еднократна дейност.

Алтернативно, в SQL*Plus можете да използвате NOPRINT команда. Той няма да покаже името на колоната, което не искате да показвате. Въпреки това, той ще работи само в SQL*Plus.

Например,

COLUMN column_name NOPRINT

Например,

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>

Осигурява ли правилна пагинация?

Да, ако напишете правилно заявката за пагинация.

Например,

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>

Или използвайте новата функция за ограничаване на редове на 12c, както показах по-горе.

Тук има няколко добри примера.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как можете да изпълнявате една и съща заявка няколко пъти, като използвате цикъл в PL/SQL?

  2. Коригиране на грешка „ORA-01789:блокът на заявката има неправилен брой колони с резултати“

  3. Как да изпълня съхранена процедура на оракул?

  4. Как мога да видя плана за изпълнение на SQL в Oracle?

  5. Базата данни на Oracle виси безкрайно в заявки за UPDATE