Ar yra būdas priversti Oracle
užklausą elgtis taip, tarsi joje būtų MySQL limit
sąlyga?
MySQL
galiu tai padaryti:
select *
from sometable
order by name
limit 20,10
norėdamas gauti 21-30 eilutes (praleiskite pirmąsias 20, pateikite kitas 10). Eilutės atrenkamos po order by
, todėl iš tikrųjų pradedama nuo 20-ojo vardo pagal abėcėlę.
Oracle
sistemoje žmonės mini tik rownum
pseudostulpelį, tačiau jis vertinamas *prieš order by
, o tai reiškia štai ką:
select *
from sometable
where rownum <= 10
order by name
grąžins atsitiktinį dešimties eilučių rinkinį, sutvarkytą pagal pavadinimą, o to paprastai nenoriu. Taip pat negalima nurodyti poslinkio.
Tam galite naudoti použduotį, pvz.
select *
from
( select *
from emp
order by sal desc )
where ROWNUM <= 5;
Taip pat peržiūrėkite temą Apie ROWNUM ir rezultatų ribojimą adresu Oracle/AskTom, kur rasite daugiau informacijos.
Atnaujinimas: Norint apriboti rezultatą su apatine ir viršutine ribomis, viskas šiek tiek išsiplečia
select * from
( select a.*, ROWNUM rnum from
( <your_query_goes_here, with order by> ) a
where ROWNUM <= :MAX_ROW_TO_FETCH )
where rnum >= :MIN_ROW_TO_FETCH;
(nukopijuota iš nurodyto AskTom straipsnio)
Atnaujinimas 2: Nuo Oracle 12c (12.1) yra sintaksė, leidžianti apriboti eilutes arba pradėti nuo poslinkių.
SELECT *
FROM sometable
ORDER BY name
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
Daugiau pavyzdžių rasite šiame atsakyme. Ačiū Krumia už užuominą.
Analitinis sprendimas su tik viena įterpta užklausa:
SELECT * FROM
(
SELECT t.*, Row_Number() OVER (ORDER BY name) MyRow FROM sometable t
)
WHERE MyRow BETWEEN 10 AND 20;
Rank()
galima pakeisti Row_Number()
, tačiau gali būti grąžinta daugiau įrašų, nei tikėtasi, jei yra pasikartojančių vardo reikšmių.
(nepatikrinta), kažkas panašaus gali atlikti šį darbą
WITH
base AS
(
select * -- get the table
from sometable
order by name -- in the desired order
),
twenty AS
(
select * -- get the first 30 rows
from base
where rownum < 30
order by name -- in the desired order
)
select * -- then get rows 21 .. 30
from twenty
where rownum > 20
order by name -- in the desired order
Taip pat yra analitinė funkcija rangas, kurią galite naudoti tvarkai pagal.