ORACLE sql查询获得前三名工资rownum大于

时间:2012-04-15 04:28:07

标签: sql oracle

我想写一个查询来显示获得前三名薪水的员工

  SELECT *
    FROM (SELECT salary, first_name
            FROM employees
        ORDER BY salary desc)
   WHERE rownum <= 3;

但我不明白如何计算嵌套查询的rownum 这项工作是否有效,或者如果有问题,请求您让我理解:

SELECT *
  FROM (SELECT salary, first_name 
          FROM employees
      ORDER BY salary )
 WHERE rownum >= 3;

我浏览了这个链接Oracle/SQL: Why does query "SELECT * FROM records WHERE rownum >= 5 AND rownum <= 10" - return zero rows,但它再次指向一个链接,但没有给出答案

8 个答案:

答案 0 :(得分:6)

a_horse_with_no_name的答案很好,
但只是为了让你明白为什么你的第一个查询有效,而你的第二个查询没有:

当您使用子查询时,Oracle不会神奇地使用子查询的rownum,它只是获取订购的数据,因此它会相应地给出rownum,第一个匹配条件的行仍然会获得rownum 1,依此类推。这就是您的第二个查询仍然不返回任何行的原因。

如果要限制起始行,则需要保留子查询的rownum,即:

SELECT *
FROM (SELECT * , rownum rn
  FROM (SELECT salary, first_name
          FROM employees
      ORDER BY salary ) )sq
WHERE sq.rn >= 3;

但是a_horse_with_no_name表示有更好的选择......

编辑:为了让事情变得更清晰,请查看此查询:

with t as (
select 'a' aa, 4 sal from dual
union all
select 'b' aa, 1 sal from dual
union all
select 'c' aa, 5 sal from dual
union all
select 'd' aa, 3 sal from dual
union all
select 'e' aa, 2 sal from dual
order by aa
)
select sub.*, rownum main_rn 
  from (select t.*, rownum sub_rn from t order by sal) sub 
 where rownum < 4

注意sub rownum和主rownum之间的区别,看看哪一个用于标准

答案 1 :(得分:4)

将查询的“rownum”分配 之前将订单应用于结果。所以rownumw 42可能会成为第一排。

一般来说,您需要使用内部查询中的rownum来限制总体输出。这在手册中有很好的解释:

http://docs.oracle.com/cd/E11882_01/server.112/e26088/pseudocolumns009.htm#i1006297

我更喜欢使用row_number(),因为你可以更好地控制排序,而且它是一个适用于大多数现代DBMS的标准功能:

SELECT *
FROM (
  SELECT salary, 
         first_name, 
         row_number() over (order by salary) as rn
  FROM employees
)
WHERE rn <= 3
ORDER BY salary;

您应该理解,在这种情况下,派生表只需要能够在生成的rn列上应用条件。由于row_number() 的值取决于over(...)部分中的顺序指定(它与应用于该dense_rank()的任何顺序无关),因此无法避免“rownum问题”查询本身)

请注意,这不会归还具有相同工资且仍然位于前三名的员工。在这种情况下,使用{{1}}可能更合适。

答案 2 :(得分:0)

如果你想选择薪水前三名的人......或许你应该考虑使用分析......更像是

SELECT *
FROM (
    SELECT salary, first_name, dense_rank() over(order by salary desc) sal_rank
    FROM employees 
)
WHERE  sal_rank <= 3

即具有第三高(排名)薪水金额(或更多)的所有人

这比使用普通rownum的好处是,如果你有多个人有相同的薪水,他们都会被退回。

答案 3 :(得分:0)

打印第五高薪的最简单方法。

SELECT MIN(SALARY) FROM (SELECT SALARY FROM EMPLOYEES ORDER BY DESC) WHERE ROWNUM BETWEEN 1 AND 5 

根据同样的情况,如果你想打印第3或第4个最高工资,那么只需要最后一个值。(意味着代替5使用3或4你将得到第3或第4个最高薪水)。

SELECT MIN(SALARY) FROM (SELECT SALARY FROM EMPLOYEES ORDER BY DESC) WHERE ROWNUM BETWEEN 1 AND 4

SELECT MIN(SALARY) FROM (SELECT SALARY FROM EMPLOYEES ORDER BY DESC) WHERE ROWNUM BETWEEN 1 AND 3

答案 4 :(得分:0)

SELECT EMPNO,        SAL,        (SELECT SUM(E.SAL)FROM TEST E WHERE E.EMPNO&lt; = T.EMPNO)R_SAL   FROM(选择EMPNO,SAL来自EMPNO的测试订单)T

答案 5 :(得分:0)

在oracle中找到前三名员工的最简单方法是返回所有字段详细信息:

SELECT *
FROM (
    SELECT * FROM emp  
      ORDER BY sal DESC)
WHERE rownum <= 3 ;

答案 6 :(得分:0)

select * 
from (
    select emp.*, 
           row_number() over(order by sal desc)r 
    from emp
) 
where r <= 3;

答案 7 :(得分:0)

SELECT Max(Salary)
FROM Employee
WHERE Salary < (SELECT Max(salary) FROM employee WHERE Salary NOT IN (SELECT max(salary) FROM employee))
ORDER BY salary DESC;