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
sıralama ölçütü
nden sonra seçilir, bu nedenle gerçekten alfabetik olarak 20. isimden başlar.Oracleda, insanların bahsettiği tek şey
rownumsözde sütunudur, ancak
order 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 <= 5;
Daha fazla bilgi için Oracle/AskTom'daki ROWNUM ve sonuçların sınırlandırılması hakkında konusuna da göz atın.
Güncelleme: Sonucu hem alt hem de üst sınırlarla sınırlamak için işler biraz daha şişirilir
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;
(Belirtilen AskTom-makalesinden kopyalanmıştır)
Güncelleme 2: Oracle 12c (12.1) ile başlayarak, satırları sınırlamak veya ofsetlerden başlamak için bir sözdizimi mevcuttur.
SELECT *
FROM sometable
ORDER BY name
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
Daha fazla örnek için bu cevaba bakınız. İpucu için Krumia'ya teşekkürler.
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()yerine
Row_Number()` kullanılabilir, ancak ad için yinelenen değerler varsa beklediğinizden daha fazla kayıt dönebilir.
(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.