mcp*_*son 249

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

select fname from MyTbl where rownum = 1
Run Code Online (Sandbox Code Playgroud)

您还可以使用分析函数来排序并获取顶部x:

select max(fname) over (rank() order by some_factor) from MyTbl
Run Code Online (Sandbox Code Playgroud)

  • 如果你只想要一行而不关心哪一行,这很好.如果你想要特定的行,比如最近的记录,你需要在子选择中进行排序,比如Vash的答案.Oracle在排序之前分配rownums. (51认同)
  • @Scott是的.那是正确的.帕特里克,好的一点,我认为语法不正确.它应该是一个保持结束(dense_rank()最后...) (4认同)
  • 语法不正确:从MyTbl选择max(fname)over(rank()order by some_factor) (3认同)
  • 第一个示例和第二个示例之间的区别在于,第一个示例选择A行(任何行,无顺序)。第二个示例获取第一行的值,而不进行订单内部查询(如下例所示)。 (2认同)
  • @Sepster,我同意不应该避免它,只是根据我的经验,我没有遇到很多真正了解此功能的人 (2认同)

Dam*_*ash 156

SELECT *
  FROM (SELECT * FROM MyTbl ORDER BY Fname )
 WHERE ROWNUM = 1;
Run Code Online (Sandbox Code Playgroud)

  • 这个答案正确地获得了TOP行(在限制ROWNUM之前命令结果). (7认同)
  • @OMGPonies是的.但它可能是大多数人真正想要通过谷歌搜索他们的问题来到这个页面 (4认同)
  • 这肯定必须是这个帖子中的获胜答案.我可能会添加一个注释,对于`top X`,可以将其更改为`WHERE ROWNUM <= X` (3认同)

MSK*_*MSK 27

使用Oracle 12c(2013年6月),您可以像以下一样使用它.

SELECT * FROM   MYTABLE
--ORDER BY COLUMNNAME -OPTIONAL          
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
Run Code Online (Sandbox Code Playgroud)

  • 有趣的命令,我在这里使用12c并且`OFFSET 0 ROWS`显然不是必需的,你可以使用`FETCH NEXT 1 ROWS ONLY'甚至`FETCH FIRST ROW ONLY`,顺序是重要的或它将是等价的只使用`WHERE rownum = 1`.我甚至在OUTER APPLY指令中尝试过它,它就像Ms-SQL的TOP函数一样. (6认同)

Sar*_*avu 9

你可以使用ROW_NUMBER()一个ORDER BY子查询子句和更换使用此列TOP 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;
Run Code Online (Sandbox Code Playgroud)

结果

在此输入图像描述

在某些情况下,我们需要选择TOP N各自的结果NAME.在这种情况下,我们可以使用PARTITION BYORDER 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;
Run Code Online (Sandbox Code Playgroud)

结果

在此输入图像描述


a'r*_*a'r 7

select * from (
    select FName from MyTbl
)
where rownum <= 1;
Run Code Online (Sandbox Code Playgroud)


Sum*_*man 7

你可以做点什么

    SELECT *
      FROM (SELECT Fname FROM MyTbl ORDER BY Fname )
 WHERE rownum = 1;
Run Code Online (Sandbox Code Playgroud)

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


OMG*_*ies 5

使用:

SELECT x.*
  FROM (SELECT fname 
          FROM MyTbl) x
 WHERE ROWNUM = 1
Run Code Online (Sandbox Code Playgroud)

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