sql >> Database teknologi >  >> RDS >> Oracle

Hvordan ROWNUM fungerer i pagineringsforespørgsel?

Du har 4 spørgsmål, og alle kredser om brugen og funktionaliteten af ​​ROWNUM . Jeg vil besvare hvert spørgsmål enkeltvis.

Hvorfor (dette var mit første forsøg, indtil jeg søgte på SO) Vælg * Fra person Hvor rownum> 100 og rownum <110; returnerer 0 rækker ?

Fin forklaring af Thomas Kyte angående ROWNUM og paginering her.

Et ROWNUM værdi tildeles en række, efter at den har passeret prædikatfasen af forespørgslen, men før forespørgslen foretager nogen sortering eller aggregering. Desuden øges en ROWNUM-værdi kun, efter at den er tildelt, hvilket er grunden til, at følgende forespørgsel aldrig returnerer en række:

vælg * fra t hvor ROWNUM> 1; 

Fordi ROWNUM> 1 ikke er sandt for den første række, går ROWNUM ikke videre til 2. Derfor bliver ingen ROWNUM-værdi nogensinde større end 1.

Hvorfor er der ingen enkel måde at gøre noget som Vælg ... FRA ... HVOR rækkenummer MELLEM nedre grænse og øvre grænse?

Ja der er. Fra Oracle 12c og fremefter kan du bruge den nye Top-n Row-begrænsning funktion. Se mit svar her.

For eksempel ville nedenstående forespørgsel returnere medarbejderne mellem 4. højeste indtil 7. højeste lønninger i stigende rækkefølge:

SQL> VÆLG empno, sal 2 FROM emp 3 BESTIL EFTER sal 4 OFFSET 4 RÆKER HENT KUN NÆSTE 4 RÆKKER; EMPNO SAL---------- ---------- 7654 1250 7934 1300 7844 1500 7499 1600SQL> 

Hvordan slipper man af med r-kolonnen i de resulterende værdier?

I stedet for vælg * , angiv de nødvendige kolonnenavne i den ydre forespørgsel. For ofte at bruge forespørgslen er oprettelse af en visning en enkel engangsaktivitet.

Alternativt i SQL*Plus du kan bruge NOPRINT kommando. Det vil ikke vise det kolonnenavn, du ikke ønsker at vise. Det ville dog kun virke i SQL*Plus.

For eksempel,

COLUMN column_name NOPRINT 

For eksempel,

SQL> desc dept Navn Null? Skriv -------------------------------------------------- ------------ DEPTNO NUMMER(2) DNAME VARCHAR2(14) LOC VARCHAR2(13)SQL> COLUMN dname NOPRINTSQL> COLUMN LOC NOPRINTSQL> SELECT * FROM dept; DEPTNO---------- 10 20 30 40SQL> 

Sikrer det korrekt paginering?

Ja, hvis du skriver pagineringsforespørgslen korrekt.

For eksempel

SELECT valFROM (VÆLG val, rækkenummer SOM rnum FRA (VÆLG val FRA t BESTIL EFTER val) HVOR rækkenummer <=8)HVOR rnum>=5; VAL---------- 3 3 4 44 rækker valgt.SQL>

Eller brug den nye rækkebegrænsende funktion på 12c, som jeg har vist ovenfor.

Få gode eksempler her.



  1. Sådan installeres SQL Server på en Mac med VirtualBox

  2. Automatisk stigning til Oracle

  3. Skalering af din tidsseriedatabase - Sådan skalerer du ganske enkelt TimescaleDB

  4. SQLException:Protokolbrud. Oracle JDBC-driver problem