Yanıtlar:
Yalnızca ilk seçilen satırı istiyorsanız, şunları yapabilirsiniz:
select fname from MyTbl where rownum = 1
Üstteki x'i sıralamak ve almak için analitik işlevleri de kullanabilirsiniz:
select max(fname) over (rank() order by some_factor) from MyTbl
SELECT *
FROM (SELECT * FROM MyTbl ORDER BY Fname )
WHERE ROWNUM = 1;
top X
Biri için bunu değiştirebilir bir not ekleyebilirWHERE ROWNUM <= X
İle Oracle 12c (Haziran 2013), aşağıdakilerden gibi kullanmak mümkün.
SELECT * FROM MYTABLE
--ORDER BY COLUMNNAME -OPTIONAL
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
OFFSET 0 ROWS
görünüşte gerekli değil, kullanabilirsiniz FETCH NEXT 1 ROWS ONLY
veya hatta FETCH FIRST ROW ONLY
, sipariş önemlidir veya sadece a kullanmaya eşdeğer olacaktır WHERE rownum = 1
. Hatta bir OUTER UYGULAMA talimatı denedim ve orada Ms-SQL TOP işlevi gibi çalıştı.
TIES
. Bakın bu bağları sürümü için ortaya çıktığında durumlarda 12c +
ve12c -
Alt sorguda ROW_NUMBER()
bir ORDER BY
cümle ile kullanabilir ve bunun yerine bu sütunu kullanabilirsiniz TOP N
. Bu adım adım açıklanabilir.
İki sütun NAME
ve içeren aşağıdaki tabloya bakın DT_CREATED
.
Ne olursa olsun, yalnızca ilk iki tarihi almanız gerekiyorsa NAME
, aşağıdaki sorguyu kullanabilirsiniz. Mantık sorgunun içine yazılmıştır
-- The number of records can be specified in WHERE clause
SELECT RNO,NAME,DT_CREATED
FROM
(
-- Generates numbers in a column in sequence in the order of date
SELECT ROW_NUMBER() OVER (ORDER BY DT_CREATED) AS RNO,
NAME,DT_CREATED
FROM DEMOTOP
)TAB
WHERE RNO<3;
SONUÇ
Bazı durumlarda, TOP N
her biriyle ilgili sonuçları seçmemiz gerekir NAME
. Bu durumda alt sorguda PARTITION BY
bir ORDER BY
cümle ile birlikte kullanabiliriz . Aşağıdaki sorguyu inceleyin.
-- The number of records can be specified in WHERE clause
SELECT RNO,NAME,DT_CREATED
FROM
(
--Generates numbers in a column in sequence in the order of date for each NAME
SELECT ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY DT_CREATED) AS RNO,
NAME,DT_CREATED
FROM DEMOTOP
)TAB
WHERE RNO<3;
SONUÇ
with (select ... ) as
fıkra) bu soruna hiçbir şey değiştirmez, CTE sadece sorguları okumayı ve desteklemeyi amaçlar. Sağ? @Sarath Avanavu
Gibi bir şey yapabilirsin
SELECT *
FROM (SELECT Fname FROM MyTbl ORDER BY Fname )
WHERE rownum = 1;
Analitik fonksiyonları RANK ve / veya DENSE_RANK da kullanabilirsiniz , ancak ROWNUM muhtemelen en kolay olanıdır .
kullanın:
SELECT x.*
FROM (SELECT fname
FROM MyTbl) x
WHERE ROWNUM = 1
Oracle9i + kullanıyorsanız, ROW_NUMBER () gibi analitik işlevleri kullanmaya bakabilirsiniz, ancak ROWNUM kadar iyi performans göstermezler .
Bir tablodan ilk satırı seçmek ve bir tablodan bir satır seçmek için iki farklı görev vardır ve farklı bir sorgu gerekir. Bunu yapmanın birçok yolu vardır. Bunlardan dördü:
İlk
select max(Fname) from MyTbl;
İkinci
select min(Fname) from MyTbl;
Üçüncü
select Fname from MyTbl where rownum = 1;
Dördüncü
select max(Fname) from MyTbl where rowid=(select max(rowid) from MyTbl)
Aynı sorunu yaşadım ve bunu bu çözümle düzeltebilirim:
select a.*, rownum
from (select Fname from MyTbl order by Fname DESC) a
where
rownum = 1
İlk değeri en üstte tutmak için sonucunuzu sipariş edebilirsiniz.
İyi şanslar