Câu trả lời:
Nếu bạn chỉ muốn một hàng được chọn đầu tiên, bạn có thể:
select fname from MyTbl where rownum = 1
Bạn cũng có thể sử dụng các hàm phân tích để đặt hàng và lấy đầu x:
select max(fname) over (rank() order by some_factor) from MyTbl
SELECT *
FROM (SELECT * FROM MyTbl ORDER BY Fname )
WHERE ROWNUM = 1;
top X
một người có thể thay đổi nó thànhWHERE ROWNUM <= X
Với Oracle 12c (tháng 6 năm 2013), bạn có thể sử dụng nó như sau.
SELECT * FROM MYTABLE
--ORDER BY COLUMNNAME -OPTIONAL
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
OFFSET 0 ROWS
rõ ràng là không cần thiết, bạn có thể sử dụng FETCH NEXT 1 ROWS ONLY
hoặc thậm chí FETCH FIRST ROW ONLY
, thứ tự theo là quan trọng hoặc nó sẽ tương đương với chỉ sử dụng a WHERE rownum = 1
. Tôi thậm chí đã thử nó trong một hướng dẫn ỨNG DỤNG NGOÀI TRỜI và nó hoạt động giống như chức năng TOP của Ms-SQL ở đó.
TIES
. Tham khảo điều này cho các trường hợp khi mối quan hệ xảy ra cho phiên bản 12c +
và12c -
Bạn có thể sử dụng ROW_NUMBER()
với một ORDER BY
mệnh đề trong truy vấn phụ và sử dụng cột này để thay thế TOP N
. Điều này có thể được giải thích từng bước.
Xem bảng dưới đây có hai cột NAME
và DT_CREATED
.
Nếu bạn chỉ cần mất hai ngày đầu tiên không phân biệt NAME
, bạn có thể sử dụng truy vấn bên dưới. Logic đã được viết bên trong truy vấn
-- 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;
KẾT QUẢ
Trong một số tình huống, chúng ta cần chọn TOP N
kết quả tương ứng với từng kết quả NAME
. Trong trường hợp như vậy, chúng ta có thể sử dụng PARTITION BY
với một ORDER BY
mệnh đề trong truy vấn phụ. Tham khảo các truy vấn dưới đây.
-- 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;
KẾT QUẢ
with (select ... ) as
mệnh đề) không thay đổi bất cứ điều gì cho vấn đề này, CTE chỉ nhằm mục đích đọc và hỗ trợ các truy vấn. Đúng? @Sarath Avanavu
Sử dụng:
SELECT x.*
FROM (SELECT fname
FROM MyTbl) x
WHERE ROWNUM = 1
Nếu sử dụng Oracle9i +, bạn có thể xem xét việc sử dụng các hàm phân tích như ROW_NUMBER () nhưng chúng sẽ không hoạt động tốt như ROWNUM .
Để chọn hàng đầu tiên từ một bảng và để chọn một hàng từ một bảng là hai nhiệm vụ khác nhau và cần một truy vấn khác nhau. Có nhiều cách có thể để làm như vậy. Bốn trong số đó là:
Đầu tiên
select max(Fname) from MyTbl;
Thứ hai
select min(Fname) from MyTbl;
Ngày thứ ba
select Fname from MyTbl where rownum = 1;
Thứ tư
select max(Fname) from MyTbl where rowid=(select max(rowid) from MyTbl)
Tôi đã có cùng một vấn đề và tôi có thể khắc phục vấn đề này bằng giải pháp này:
select a.*, rownum
from (select Fname from MyTbl order by Fname DESC) a
where
rownum = 1
Bạn có thể đặt kết quả của bạn trước để có giá trị đầu tiên trên đầu trang.
Chúc may mắn