Oracle Database
Begränsa raderna som returneras av en fråga (Pagination)
Sök…
Få de första N-raderna med radbegränsande klausul
FETCH
klausulen infördes i Oracle 12c R1:
SELECT val
FROM mytable
ORDER BY val DESC
FETCH FIRST 5 ROWS ONLY;
Ett exempel utan FETCH som fungerar också i tidigare versioner:
SELECT * FROM (
SELECT val
FROM mytable
ORDER BY val DESC
) WHERE ROWNUM <= 5;
Pagination i SQL
SELECT val
FROM (SELECT val, rownum AS rnum
FROM (SELECT val
FROM rownum_order_test
ORDER BY val)
WHERE rownum <= :upper_limit)
WHERE rnum >= :lower_limit ;
på detta sätt kan vi paginera tabelldata, precis som webbserversida
Få N antal poster från tabellen
Vi kan begränsa antalet rader från resultat med hjälp av rownum-klausul
select * from
(
select val from mytable
) where rownum<=5
Om vi vill ha första eller sista posten vill vi ordning efter klausul i den inre frågan som ger resultat baserat på ordning.
Sista fem posten:
select * from
(
select val from mytable order by val desc
) where rownum<=5
Första fem posten
select * from
(
select val from mytable order by val
) where rownum<=5
Få rad N till och med M från många rader (före Oracle 12c)
Använd den analytiska funktionen radnummer ():
with t as (
select col1
, col2
, row_number() over (order by col1, col2) rn
from table
)
select col1
, col2
from t
where rn between N and M; -- N and M are both inclusive
Oracle 12c hanterar detta lättare med OFFSET
och FETCH
.
Hoppar över några rader och tar sedan några
I Oracle 12g +
SELECT Id, Col1
FROM TableName
ORDER BY Id
OFFSET 20 ROWS FETCH NEXT 20 ROWS ONLY;
I tidigare versioner
SELECT Id,
Col1
FROM (SELECT Id,
Col1,
row_number() over (order by Id) RowNumber
FROM TableName)
WHERE RowNumber BETWEEN 21 AND 40
Hoppar över några rader från resultatet
I Oracle 12g +
SELECT Id, Col1
FROM TableName
ORDER BY Id
OFFSET 5 ROWS;
I tidigare versioner
SELECT Id,
Col1
FROM (SELECT Id,
Col1,
row_number() over (order by Id) RowNumber
FROM TableName)
WHERE RowNumber > 20
Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow