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