28

我尝试了以下查询:

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 过滤器时没有返回任何记录?

4

10 回答 10

63

为了解释这种行为,我们需要了解 Oracle 如何处理 ROWNUM。将ROWNUM分配给一行时,Oracle从1开始,只有在选择一行时才增加值;也就是说,当 WHERE 子句中的所有条件都满足时。由于我们的条件要求 ROWNUM 大于 2,因此不会选择任何行,并且 ROWNUM 的增量永远不会超过 1。

最重要的是,以下条件将按预期工作。

.. WHERE rownum = 1;

.. WHERE rownum <= 10;

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

.. WHERE rownum = 2;

.. WHERE rownum > 10;

引自了解 Oracle rownum

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

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

编辑:我已经更正了查询以在通过 sal desc 订购后获取 rownum

于 2012-02-11T12:31:34.893 回答
11

在第一个查询中,第一行的 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                   
于 2012-02-11T13:02:27.690 回答
2

试试这个:

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

参考

于 2012-02-11T12:30:47.180 回答
2

对于在 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;
于 2017-05-09T09:55:52.880 回答
0

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

于 2015-07-07T06:57:34.880 回答
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;
于 2016-12-08T08:33:19.540 回答
0

从Oracle中的表中选择第二行

SELECT *
FROM (SELECT * FROM emp ORDER BY rownum DESC)
WHERE rownum=1
于 2019-12-09T17:07:56.147 回答
0

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

RNUMBER SNAME MARKS


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

SQL> select * from(select MARKS,ROWNUM AS RS from (select * from stud order by tags desc)) where RS=2;

 MARKS         RS

    65          2

SQL>

于 2020-10-22T09:51:15.713 回答
-1

您可以在这里使用RANKDENSE_RANK实现您想要实现的目标。

于 2016-05-10T12:19:25.540 回答
-1

试试这个查询 100% 工作

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

于 2021-03-29T18:17:49.423 回答