276

如何执行以下操作?

select top 1 Fname from MyTbl

Oracle 11g中?

4

9 回答 9

288

如果您只想要第一个选定的行,您可以:

select fname from MyTbl where rownum = 1

您还可以使用分析函数对前 x 进行排序和取值:

select max(fname) over (rank() order by some_factor) from MyTbl
于 2010-08-10T17:13:06.227 回答
183
SELECT *
  FROM (SELECT * FROM MyTbl ORDER BY Fname )
 WHERE ROWNUM = 1;
于 2010-08-10T17:13:26.457 回答
43

使用Oracle 12c(2013 年 6 月),您可以像下面这样使用它。

SELECT * FROM   MYTABLE
--ORDER BY COLUMNNAME -OPTIONAL          
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
于 2015-04-27T15:02:14.350 回答
13

您可以在子查询中使用ROW_NUMBER()with子句,并使用此列替换. 这可以逐步解释。ORDER BYTOP N

请参阅下表,其中有两列NAMEDT_CREATED

在此处输入图像描述

如果您只需要获取前两个日期而不考虑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;

结果

在此处输入图像描述

在某些情况下,我们需要TOP N分别选择每个结果NAME。在这种情况下,我们可以在子查询中使用PARTITION BYwith子句。ORDER 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;

结果

在此处输入图像描述

于 2015-11-06T04:59:01.703 回答
11
select * from (
    select FName from MyTbl
)
where rownum <= 1;
于 2010-08-10T17:13:22.760 回答
10

你可以做类似的事情

    SELECT *
      FROM (SELECT Fname FROM MyTbl ORDER BY Fname )
 WHERE rownum = 1;

您也可以使用分析函数RANK和/或DENSE_RANK,但ROWNUM可能是最简单的。

于 2013-12-09T12:51:36.543 回答
6

采用:

SELECT x.*
  FROM (SELECT fname 
          FROM MyTbl) x
 WHERE ROWNUM = 1

如果使用 Oracle9i+,您可以考虑使用 ROW_NUMBER() 之类的分析函数,但它们的性能不如 ROWNUM

于 2010-08-10T17:31:21.347 回答
3

我有同样的问题,我可以用这个解决方案解决这个问题:

select a.*, rownum 
from (select Fname from MyTbl order by Fname DESC) a
where
rownum = 1

您可以在将第一个值放在首位之前对结果进行排序。

祝你好运

于 2013-07-27T23:12:10.560 回答
3

从表中选择第一行和从表中选择一行是两个不同的任务,需要不同的查询。有很多可能的方法可以做到这一点。其中四个是:

第一的

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)
于 2014-03-12T15:37:49.203 回答