Jawaban:
Jika Anda ingin hanya baris yang dipilih pertama, Anda dapat:
select fname from MyTbl where rownum = 1
Anda juga dapat menggunakan fungsi analitik untuk memesan dan mengambil x atas:
select max(fname) over (rank() order by some_factor) from MyTbl
SELECT *
FROM (SELECT * FROM MyTbl ORDER BY Fname )
WHERE ROWNUM = 1;
top X
seseorang dapat mengubahnya keWHERE ROWNUM <= X
Dengan Oracle 12c (Juni 2013), Anda dapat menggunakannya seperti berikut ini.
SELECT * FROM MYTABLE
--ORDER BY COLUMNNAME -OPTIONAL
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
OFFSET 0 ROWS
tampaknya tidak perlu, Anda dapat menggunakan FETCH NEXT 1 ROWS ONLY
atau bahkan FETCH FIRST ROW ONLY
, urutan oleh itu penting atau akan setara dengan hanya menggunakan a WHERE rownum = 1
. Saya bahkan sudah mencobanya dalam instruksi BERLAKU LUAR dan berfungsi seperti fungsi TOP Ms-SQL di sana.
TIES
. Lihat ini untuk kasus-kasus ketika ikatan terjadi untuk versi 12c +
dan12c -
Anda bisa menggunakan ROW_NUMBER()
dengan ORDER BY
klausa dalam sub-kueri dan menggunakan kolom ini sebagai pengganti TOP N
. Ini bisa dijelaskan selangkah demi selangkah.
Lihat tabel di bawah ini yang memiliki dua kolom NAME
dan DT_CREATED
.
Jika Anda hanya perlu mengambil dua tanggal pertama terlepas dari NAME
, Anda dapat menggunakan kueri di bawah ini. Logikanya telah ditulis di dalam kueri
-- 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;
HASIL
Dalam beberapa situasi, kita perlu memilih TOP N
hasil masing-masing NAME
. Dalam kasus seperti itu, kita dapat menggunakan PARTITION BY
dengan ORDER BY
klausa dalam sub-kueri. Lihat kueri di bawah ini.
-- 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;
HASIL
with (select ... ) as
klausa) tidak mengubah apa pun untuk masalah ini, CTE hanya bertujuan membaca dan mendukung pertanyaan. Baik? @Sarath Avanavu
Anda dapat melakukan sesuatu seperti
SELECT *
FROM (SELECT Fname FROM MyTbl ORDER BY Fname )
WHERE rownum = 1;
Anda juga bisa menggunakan fungsi analitik RANK dan / atau DENSE_RANK , tetapi ROWNUM mungkin yang paling mudah.
Menggunakan:
SELECT x.*
FROM (SELECT fname
FROM MyTbl) x
WHERE ROWNUM = 1
Jika menggunakan Oracle9i +, Anda dapat melihat menggunakan fungsi analitik seperti ROW_NUMBER () tetapi mereka tidak akan berkinerja sebaik ROWNUM .
Untuk memilih baris pertama dari sebuah tabel dan memilih satu baris dari sebuah tabel adalah dua tugas yang berbeda dan memerlukan kueri yang berbeda. Ada banyak cara yang memungkinkan untuk melakukannya. Empat di antaranya adalah:
Pertama
select max(Fname) from MyTbl;
Kedua
select min(Fname) from MyTbl;
Ketiga
select Fname from MyTbl where rownum = 1;
Keempat
select max(Fname) from MyTbl where rowid=(select max(rowid) from MyTbl)
Saya memiliki masalah yang sama, dan saya dapat memperbaikinya dengan solusi ini:
select a.*, rownum
from (select Fname from MyTbl order by Fname DESC) a
where
rownum = 1
Anda dapat memesan hasil Anda sebelum memiliki nilai pertama di atas.
Semoga berhasil