我该怎么做呢?

select top 1 Fname from MyTbl

在Oracle 11g?


当前回答

您可以在子查询中使用带有ORDER BY子句的ROW_NUMBER(),并使用此列替换TOP n。这可以逐步解释。

请参阅下面的表,其中有两个列NAME和DT_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;

结果

在某些情况下,我们需要选择与每个NAME对应的TOP N结果。在这种情况下,我们可以在子查询中使用PARTITION BY和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;

结果

其他回答

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

SELECT * FROM   MYTABLE
--ORDER BY COLUMNNAME -OPTIONAL          
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY

Use:

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

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

如果你只想要第一个被选中的行,你可以:

select fname from MyTbl where rownum = 1

你也可以用解析函数来排序,取最上面的x:

select max(fname) over (rank() order by some_factor) from MyTbl
select * from (
    select FName from MyTbl
)
where rownum <= 1;

您可以在子查询中使用带有ORDER BY子句的ROW_NUMBER(),并使用此列替换TOP n。这可以逐步解释。

请参阅下面的表,其中有两个列NAME和DT_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;

结果

在某些情况下,我们需要选择与每个NAME对应的TOP N结果。在这种情况下,我们可以在子查询中使用PARTITION BY和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;

结果