Sıralama sonrasında bir Oracle sorgusu tarafından döndürülen satır sayısını nasıl sınırlayabilirim?

Bir Oracle sorgusunun bir MySQL limit cümlesi içeriyormuş gibi davranmasını sağlamanın bir yolu var mı?

MySQL`de bunu yapabilirim:

select * 
from sometable
order by name
limit 20,10
  1. ila 30. sıraları almak için (ilk 20'yi atlayın, sonraki 10'u verin). Satırlar sıralama ölçütünden sonra seçilir, bu nedenle gerçekten alfabetik olarak 20. isimden başlar.

Oracleda, insanların bahsettiği tek şeyrownumsözde sütunudur, ancakorder by`dan önce değerlendirilir, bu da şu anlama gelir:

select * 
from sometable
where rownum <= 10
order by name

isme göre sıralanmış on satırdan oluşan rastgele bir küme döndürecektir ki bu genellikle istediğim şey değildir. Ayrıca bir ofset belirtmeye de izin vermiyor.

Bunun için aşağıdaki gibi bir alt sorgu kullanabilirsiniz


select *
from  
( select * 
  from emp 
  order by sal desc ) 
where ROWNUM 
Yorumlar (6)

Yalnızca bir iç içe sorguya sahip analitik bir çözüm:

SELECT * FROM
(
   SELECT t.*, Row_Number() OVER (ORDER BY name) MyRow FROM sometable t
) 
WHERE MyRow BETWEEN 10 AND 20;

Rank()yerineRow_Number()` kullanılabilir, ancak ad için yinelenen değerler varsa beklediğinizden daha fazla kayıt dönebilir.

Yorumlar (3)

(test edilmemiş) bunun gibi bir şey işinizi görebilir

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

Sıralama yapmak için kullanabileceğiniz analitik fonksiyon rank da vardır.

Yorumlar (2)