如何使用ROWNUM [复制](How to use rownum [duplicate])

2019-08-22 04:29发布

这个问题已经在这里有一个答案:

  • 如何从表中获取第二大或第三大项 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=2rownum<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

总之,这是甲骨文如何执行查询

  1. 在FROM / WHERE子句先行。
  2. ROWNUM从FROM / WHERE子句分配并递增到每个输出行。
  3. 选择应用。
  4. GROUP BY应用。
  5. HAVING应用。
  6. 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

请注意,如果有一个为二过一配合,查询可能返回多个值。 这就是为什么外SELECTSELECT 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]