Kaip apriboti "Oracle" užklausos grąžinamų eilučių skaičių po užsakymo?

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 
Komentarai (6)

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ų.

Komentarai (3)

(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.

Komentarai (2)