这个问题在这里已经有了答案:如何在排序后限制 Oracle 查询返回的行数? (14 个回答) 6 个月前关闭。
如何执行以下操作?
select top 1 Fname from MyTbl
在 Oracle 11g?
如果您只想要第一个选定的行,您可以:
select fname from MyTbl where rownum = 1
您还可以使用分析函数对前 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
,可以将其更改为 WHERE ROWNUM <= X
使用 Oracle 12c(2013 年 6 月),您可以像下面这样使用它。
SELECT * FROM MYTABLE
--ORDER BY COLUMNNAME -OPTIONAL
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
OFFSET 0 ROWS
显然不是必需的,您可以使用 FETCH NEXT 1 ROWS ONLY
甚至 FETCH FIRST ROW ONLY
,顺序很重要,否则它将等同于仅使用 WHERE rownum = 1
。我什至在 OUTER APPLY 指令中尝试过它,它的工作方式类似于 Ms-SQL 的 TOP 函数。
您可以在子查询中将 ROW_NUMBER()
与 ORDER BY
子句一起使用,并使用此列代替 TOP N
。这可以逐步解释。
请参阅下表,其中包含两列 NAME
和 DT_CREATED
。
https://i.stack.imgur.com/a8AS1.jpg
如果您只需要获取前两个日期而不考虑 NAME
,则可以使用以下查询。逻辑已经写在查询里面
-- 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;
结果
https://i.stack.imgur.com/f7Yfl.jpg
在某些情况下,我们需要为每个 NAME
选择 TOP N
结果。在这种情况下,我们可以在子查询中使用带有 ORDER BY
子句的 PARTITION BY
。请参阅以下查询。
-- 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;
结果
https://i.stack.imgur.com/o203n.jpg
with (select ... ) as
子句)对这个问题没有任何改变,CTE 只是为了阅读和支持查询。正确的? @萨拉特·阿瓦纳武
select * from (
select FName from MyTbl
)
where rownum <= 1;
你可以做类似的事情
SELECT *
FROM (SELECT Fname FROM MyTbl ORDER BY Fname )
WHERE rownum = 1;
您也可以使用分析函数 RANK 和/或 DENSE_RANK,但 ROWNUM 可能是最简单的。
利用:
SELECT x.*
FROM (SELECT fname
FROM MyTbl) x
WHERE ROWNUM = 1
如果使用 Oracle9i+,您可以查看 using analytic functions like ROW_NUMBER() but they won't perform as well as ROWNUM。
从表中选择第一行和从表中选择一行是两个不同的任务,需要不同的查询。有很多可能的方法可以做到这一点。其中四个是:
第一的
select max(Fname) from MyTbl;
第二
select min(Fname) from MyTbl;
第三
select Fname from MyTbl where rownum = 1;
第四
select max(Fname) from MyTbl where rowid=(select max(rowid) from MyTbl)
我有同样的问题,我可以用这个解决方案解决这个问题:
select a.*, rownum
from (select Fname from MyTbl order by Fname DESC) a
where
rownum = 1
您可以在将第一个值放在首位之前对结果进行排序。
祝你好运