sql >> Databasteknik >  >> RDS >> Oracle

Top-N-frågor och paginering i Oracle

Top-N Queries  och paginering är vanligt i webbaserade applikationer. Användaren anger en uppsättning kriterier, som kör en fråga och låter användaren klicka på knapparna Föregående och Nästa för att bläddra igenom resultatuppsättningen. För att uppnå denna personsökningsfunktion måste applikationen kunna hämta en viss uppsättning rader från databasfrågan.

Låt oss ta en titt på de olika metoderna i Oracle för att uppnå Top-N-frågor i Oracle och paginering i Oracle-fråga

Pre 12c

(1) Använder ROWNUM-klausul

Vad är ROWNUM
Det är en pseudokolumn (inte en riktig kolumn) som är tillgänglig i en fråga. ROWNUM kommer att tilldelas siffrorna 1, 2, 3, 4, … N , där N är antalet rader i uppsättningen ROWNUM används med. Ett ROWNUM-värde tilldelas inte permanent till en rad .

Här är sättet att få de 5 bästa värdena

SELECT *
FROM (SELECT *
FROM dept
ORDER BY sales DESC)
WHERE ROWNUM <= 5;

Den här versionen kommer att sortera avdelningen efter försäljning fallande och sedan returnera de första fem posterna som den stöter på (de fem främsta posterna).
För paginering i oracle, om du vill ha 5 -10 poster för avdelningens beställning efter försäljningsbeskrivning gå på det här.

SELECT a.*
FROM (SELECT ROWNUM rn, b.*
FROM ( SELECT *
FROM dept
ORDER BY sales dsc) b  where rn <=10) a
WHERE a.rn >= 5

Den allmänna syntaxen skulle vara

select *
from
( select rownum rnum, a.*
from (your_query) a
where rownum <= M )
where rnum >= N;

(2) Använder ROW_NUMBER() orakelanalysfunktion:Den beter sig på samma sätt som ROWNUM pseudokolumnen men är mer flexibel och har fler möjligheter

Här är sättet att få de 5 bästa värdena

SELECT *
FROM (SELECT d.*,row_number() over (ORDER BY d.sales DSC) rn
FROM dept d
)
WHERE rn <= 5;

Här är frågan för paginering

SELECT * FROM (
SELECT
d.*,
row_number() over (ORDER BY d.sales DSC) rn
FROM dept d) WHERE rn BETWEEN 0 AND 5 ORDER BY rn;

Ovanstående topp N-frågor kommer att ge returer olika poster när två saker är lika för platsen när de n översta frågorna används


(3) Genom att använda RANK() och DENSE_RANK():Dessa är analytiska funktioner som kan användas för att ta bort problemet ovan
Här är sättet att få de 5 bästa värdena med rank

SELECT *
FROM (SELECT d.*,rank() over (ORDER BY d.sales DSC) rn
FROM dept d
)
WHERE rn <= 5;

Här är sättet att få de 5 bästa värdena med dense_rank

SELECT *
FROM (SELECT d.*,dense_rank() over (ORDER BY d.sales DSC) rn
FROM dept d
)
WHERE rn <= 5;

Med 12c

Top-N-funktion :

Oracle Database 12c innehåller stöd för ANSI-standarden FETCH FIRST/NEXT och OFFSET-satsen – tillsammans kallad radbegränsningssatsen. Den här klausulen gör att du enkelt kan hämta de första N posterna från en resultatuppsättning eller, alternativt, de första N posterna efter att ha hoppat över en uppsättning poster, så att du enkelt kan paginera genom en resultatuppsättning

En Top-N-fråga låter oss hämta de översta eller nedersta N-raderna från en beställd uppsättning. Att kombinera två Top-N-frågor ger dig möjligheten att bläddra igenom en beställd uppsättning

Exempel:

SELECT value
FROM mytable
ORDER BY value DESC
FETCH FIRST 10 ROWS ONLY;  

select * from my_test order by name fetch first 3 rows only;

Om du tittar på optimeringsplanen för ovanstående fråga använder den fortfarande row_number() för att göra det

Paginering kan också ske med den här funktionen med offsetsyntaxen

– offset 10 rader hämtar endast de första 10 raderna

select * from my_test order by id
offset 10 rows fetch next 10 rows only;

– offset 10 rader hämtar endast första 0,1 procent rader

select * from my_test order by id offset 10 rows first 0.1 percent rows only;

– offset 10 rader hämtar de första 3 raderna med knytband. Det betyder att alla de översta raderna med oavgjort också kommer att inkluderas i resultatet

select * from my_test order by name fetch first 3 rows with ties;

Om du kontrollerar optimeringsplanen för ovanstående fråga, kommer du att upptäcka att optimizer använder rank()-funktionen som visas ovan i Pre 12c-fallet

Begränsning
(1) Om du har en SELECT-sats med FOR UPDATE kan du inte använda den.
(2) SELECT-satsen kan inte CURRVAL eller NEXTVAL av sekvenser
(3) Om frågan i materialiserade vyer har den här klausulen, då kan du inte göra en stegvis uppdatering av den materialiserade vyn

Hoppas du gillar artikeln om Top-N Queries i oracle och paginering i oracle query. Lämna gärna feedback

Läser också
Lead-funktion i Oracle
RANK-funktion i Oracle
https://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqljoffsetfetch.html


  1. Hur man ansluter till AWS MySQL / MariaDB RDS eller EC2 Database från MySQL WorkBench

  2. Hur man läser och analyserar SQL Server-exekveringsplaner

  3. Få lista över databaser från SQL Server

  4. Kan inte ansluta till postgres från fjärrvärden