sql >> Database >  >> RDS >> Oracle

Hoe ROWNUM werkt in een paginatiequery?

Je hebt 4 vragen en ze draaien allemaal om het gebruik en de functionaliteit van ROWNUM . Ik zal elke vraag één voor één beantwoorden.

Waarom (dit was mijn eerste poging totdat ik op SO zoek) Selecteer * Van Persoon Waar rownum> 100 en rownum <110; geeft 0 rijen terug ?

Mooie uitleg door Thomas Kyte over ROWNUM en paginering hier.

EEN ROWNUM waarde wordt toegewezen aan een rij nadat deze de predikaatfase heeft gepasseerd van de query, maar voordat de query wordt gesorteerd of geaggregeerd. Bovendien wordt een ROWNUM-waarde pas verhoogd nadat deze is toegewezen, daarom zal de volgende query nooit een rij retourneren:

select * 
  from t 
 where ROWNUM > 1;

Omdat ROWNUM> 1 niet waar is voor de eerste rij, gaat ROWNUM niet verder naar 2. Daarom wordt de ROWNUM-waarde nooit groter dan 1.

Waarom is er geen eenvoudige manier om zoiets te doen als Selecteer ... VAN ... WAAR rijnummer TUSSEN ondergrens EN bovengrens?

Ja dat is er. Van Oracle 12c vanaf dan kunt u de nieuwe Top-n Row-beperking . gebruiken functie. Zie hier mijn antwoord.

De onderstaande zoekopdracht zou bijvoorbeeld de werknemers tussen 4e hoogste . opleveren tot 7e hoogste salarissen in oplopende volgorde:

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>

Hoe de r-kolom in de resulterende waarden te verwijderen?

In plaats van select * , vermeld de vereiste kolomnamen in de buitenste query. Als u de query vaak gebruikt, is het maken van een weergave een eenvoudige eenmalige activiteit.

Als alternatief, in SQL*Plus je zou de NOPRINT . kunnen gebruiken opdracht. De kolomnaam die u niet wilt weergeven, wordt niet weergegeven. Het zou echter alleen werken in SQL*Plus.

Bijvoorbeeld,

COLUMN column_name NOPRINT

Bijvoorbeeld,

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>

Zorgt het voor een correcte paginering?

Ja, als u de paginatiequery correct schrijft.

Bijvoorbeeld,

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>

Of gebruik de nieuwe rijbeperkende functie op 12c, zoals ik hierboven heb laten zien.

Enkele goede voorbeelden hier.



  1. Recursieve zoekopdracht in Oracle

  2. Is er een hash-functie in PL/SQL?

  3. Gegevensmigraties

  4. Update ListView op basis van door SQLite ondersteunde ContentProvider