使用rownum选择表的第二行

时间:2012-02-11 12:25:56

标签: sql oracle oracle10g rownum

我尝试过以下查询:

select empno from (
                   select empno 
                     from emp
                    order by sal desc
                  )
where rownum = 2

这不会返回任何记录。

当我尝试此查询时

 select rownum,empno from (
                        select empno from emp order by sal desc) 

它给了我这个输出:

ROWNUM  EMPNO      
1       7802        
2       7809    
3       7813    
4       7823

有人能告诉我第一次查询有什么问题吗?为什么在添加ROWNUM过滤器时没有返回任何记录?

10 个答案:

答案 0 :(得分:50)

  

要解释这种行为,我们需要了解Oracle的处理方式   ROWNUM。将ROWNUM分配给一行时,Oracle从1开始   仅在选择行时递增值;那就是全部   满足WHERE子句中的条件。因为我们的条件需要   ROWNUM大于2,没有选择行,ROWNUM是   永远不会超过1。

     

最重要的是,以下条件将起作用   预期

     

.. WHERE rownum = 1;

     

..在哪里rownum< = 10;

     

虽然具有这些条件的查询将始终返回零行。

     

.. WHERE rownum = 2;

     

..在哪里rownum> 10;

引自Understanding Oracle rownum

您应该以这种方式修改查询以便工作:

select empno
from
    (
    select empno, rownum as rn 
    from (
          select empno
          from emp
          order by sal desc
          )
    )
where rn=2;

编辑:我已经更正了查询,以便通过sal desc 获得之后的

答案 1 :(得分:8)

第一次查询中,第一行的ROWNUM = 1,因此将被拒绝。第二行也有ROWNUM = 1(因为之前的行被拒绝)也被拒绝,第三行也有ROWNUM = 1(因为它之前的所有行都被拒绝了)也被拒绝了......网结果是所有行都被拒绝。

第二个查询不应返回您获得的结果。它应该在 ORDER BY之后正确分配ROWNUM

由于所有这些,您需要使用不是2个而是3个级别的子查询,如下所示:

SELECT EMPNO, SAL FROM ( -- Make sure row is not rejected before next ROWNUM can be assigned.
    SELECT EMPNO, SAL, ROWNUM R FROM ( -- Make sure ROWNUM is assigned after ORDER BY.
        SELECT EMPNO, SAL
        FROM EMP
        ORDER BY SAL DESC
    )
)
WHERE R = 2

结果:

EMPNO                  SAL                    
---------------------- ---------------------- 
3                      7813                   

答案 2 :(得分:1)

试试这个:

SELECT ROW_NUMBER() OVER (ORDER BY empno) AS RowNum,
       empno
FROM   tableName
WHERE  RowNumber = 2;

来自资料片段:

SELECT last_name FROM 
      (SELECT last_name, ROW_NUMBER() OVER (ORDER BY last_name) R FROM employees)
WHERE R BETWEEN 51 and 100

REFERENCE

答案 3 :(得分:1)

对于在oracle中使用rownum的第n行:

select * from TEST WHERE ROWNUM<=n
MINUS
select * from TEST WHERE ROWNUM<=(n-1);

第二行示例:

select * from TEST WHERE ROWNUM<=2
MINUS
select * from TEST WHERE ROWNUM<=1;

答案 4 :(得分:0)

从中选择empno(
                           选择empno,rownum作为朗姆酒                            来自emp,
                           由sal desc命令                   )
朗姆酒= 2;

答案 5 :(得分:0)

Select * From (SELECT *,
  ROW_NUMBER() OVER(ORDER BY column_name  DESC) AS mRow

FROM table_name 

WHERE condition) as TT
Where TT.mRow=2;

答案 6 :(得分:0)

从Oracle表中选择第二行

SELECT *
FROM (SELECT * FROM emp ORDER BY rownum DESC)
WHERE rownum=1

答案 7 :(得分:0)

尝试这种方式可以100%工作 SQL> SELECT * FROM STUD;

RNUMBER名称标记


   104 mahesh                       85
   101 DHANU                        20
   102 BHARATH                      10
   100 RAJ                          50
   103 GOPI                         65

SQL> select * from(选择MARKS,ROWNUM AS RS from(选择*从标记顺序按螺柱顺序选择*)),其中RS = 2;

 MARKS         RS

    65          2

SQL>

答案 8 :(得分:-1)

您可以使用RANKDENSE_RANK来实现您在此处尝试实现的目标。

答案 9 :(得分:-1)

试试这个查询 100% 有效

Select * from(select rownum as rn,emp.* from emp) 其中 rn=2;