我尝试过以下查询:
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过滤器时没有返回任何记录?
答案 0 :(得分:50)
要解释这种行为,我们需要了解Oracle的处理方式 ROWNUM。将ROWNUM分配给一行时,Oracle从1开始 仅在选择行时递增值;那就是全部 满足WHERE子句中的条件。因为我们的条件需要 ROWNUM大于2,没有选择行,ROWNUM是 永远不会超过1。
最重要的是,以下条件将起作用 预期
.. WHERE rownum = 1;
..在哪里rownum< = 10;
虽然具有这些条件的查询将始终返回零行。
.. WHERE rownum = 2;
..在哪里rownum> 10;
您应该以这种方式修改查询以便工作:
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
答案 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)
您可以使用RANK
或DENSE_RANK
来实现您在此处尝试实现的目标。
答案 9 :(得分:-1)
试试这个查询 100% 有效
Select * from(select rownum as rn,emp.* from emp) 其中 rn=2;