这个问题已经在这里有一个答案:
- 如何从表中获取第二大或第三大项 12个回答
- 选择无ROWNUM前N行? 5个回答
我有一个员工表与名,薪水等细节神谕。
我想获得第二高的收入,而且无法撷取。
这一个工作正常
with e_salary as (select distinct salary from employee)
select salary from e_salary
order by salary desc
并给出了输出:
450000
61000
60000
50000
40000
30000
20000
6000
但是,当我使用相同的查询来获取第二高排没有得到任何输出
select salary
from ( with e_salary as (select distinct salary from employee)
select salary from e_salary order by salary desc)
where rownum = 2
但正如我更换rownum=2
与rownum<2
它给出的第一两个记录输出。 请人解释为什么rownum=2
不工作
Answer 1:
这将工作:
选择从(选择工资,从(通过选择薪金降序从e_salary顺序薪水)ROWNUM作为RN)薪水其中RN = 2;
为什么它不工作:
当对一个行分配ROWNUM,甲骨文从1开始,仅仅增加时选择的行的值; 也就是说,当在WHERE子句中的所有条件都得到满足。 由于我们的条件要求ROWNUM大于2,没有行选择ROWNUM没有被增加超过1。
希望你是清楚的现在。
Answer 2:
select ename ,sal ,rank() over (order by sal desc) ranking from emp;
试试这个。
请点击此链接,所有关于第n行最高的东西在这里给出了在Oracle:
http://www.oratable.com/nth-highest-salary-in-oracle/
Answer 3:
ROWNUM的使用是一个棘手的事情。 最简单的办法是,只有当你想限制要显示的结果数来使用它。 例如ROWNUM <2或ROWNUM <= 5。
为什么ROWNUM = 2将无法正常工作?
读到这里- http://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html
总之,这是甲骨文如何执行查询
- 在FROM / WHERE子句先行。
- ROWNUM从FROM / WHERE子句分配并递增到每个输出行。
- 选择应用。
- GROUP BY应用。
- HAVING应用。
- ORDER BY应用。
ROWNUM <= 2子句将被转换到
ROWNUM = 1
for x in
( select * from emp )
loop
exit when NOT(ROWNUM <= 2)
OUTPUT record to temp
ROWNUM = ROWNUM+1
end loop
SORT TEMP
如果您更改与rownnum = 2时退出NOT(ROWNUM <= 2),你可以看到它会在第一次运行本身失败
所以,如果我不能用ROWNUM,我可以用什么。 尝试使用ROW_NUMBER() http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions137.htm
它的工作原理有点像
SELECT last_name FROM
(SELECT last_name, ROW_NUMBER() OVER (ORDER BY last_name) R FROM employees)
WHERE R BETWEEN 51 and 100;
Answer 4:
rownum
在条件停止评估第一次失败。 上返回的第一行, rownum
是1,因此它失败rownum = 2
测试和停止尝试。 有一个关于它的优秀岗位在这里 。
为了得到第二高的薪水,使用Oracle分析DENSE_RANK
功能:
SELECT DISTINCT Salary FROM (
SELECT Salary, DENSE_RANK() OVER (ORDER BY Salary DESC) AS SalaryRank
FROM e_salary)
WHERE SalaryRank = 2
请注意,如果有一个为二过一配合,查询可能返回多个值。 这就是为什么外SELECT
是SELECT DISTINCT
。
Answer 5:
首先,你应该明白什么rownum
是。 让我给你举个例子,
you want to get data with a filter and rownum=2,
first Oracle executes the sql with filter and get the first record,
give it the rownum 1,
and then compare it the rownum filter rownum=2, which doesn't match, so discard record,
then get second record, give it rownum=1(if the first record is matched then the rownum will be 2) too, then do the compare............
所以,你可以找到原因。
Answer 6:
如果不使用ROWNUM命令,您可以使用此查询得到第二高的薪水:
select MAX(Salary) from Employee
WHERE Salary NOT IN
(select MAX(Salary) from Employee )
要么,
select MAX(Salary) from Employee
WHERE Salary <>
(select MAX(Salary) from Employee )
查询第n最高:
SELECT * FROM Employee Emp1
WHERE (N-1) =
(SELECT COUNT(DISTINCT(Emp2.Salary))FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)
Answer 7:
据我了解,ROWNUM数字在结果集中的行。
所以,在你的例子:
选择从表1 *其中ROWNUM = 2
有多少行要在结果集? 因此,什么样的rownum会被分配到这样的行? 现在你可以看到为什么竟没有返回结果?
在一般情况下,你不应该依靠ROWNUM,或暗示为了结果的任何功能。 试想想与整个结果集的工作。
有了这样说,我相信以下将工作:
从选择*(选择ROWNUM作为RN,表1 *表1从)为t其中t.rn = 2
因为在这种情况下,你的编号子查询中的行。
文章来源: How to use rownum [duplicate]