我有HR oracle模式,在此,我想显示工资最高的员工的所有字段。
这是我到目前为止所写的内容,但未返回任何内容。
select * from (
select * from HR.EMPLOYEES
order by HR.EMPLOYEES.SALARY DESC)
where rownum=3
我想获得此结果而无需使用诸如density_rank()等任何函数。希望保持查询简单。但是,如果有人可以使用解析函数并可以解释其工作原理,那么到目前为止,我仍然可以理解其用法,但我不理解诸如density_rank()之类的函数的用法。对查询中缺少的内容有任何了解吗?
答案 0 :(得分:2)
rownum = 3
将不起作用,因为rownum
已应用于生成的结果集。结果集中的第一行始终具有rownum = 1
。没有任何结果集可以匹配rownum = 3
,因此您不会返回任何行。
执行此操作的方法是使用rank()
,dense_rank()
或row_number()
之类的分析功能。
select * from
( select emp.*
, dense_rank() over (order by salary desc) rn
from hr.employees emp
)
where rn = 3
是否使用rank()
,dense_rank()
或row_number()
取决于您处理领带的方式。
如果您使用row_number()
,则将获得表中的第三行,按薪水降序排列。如果您有两个雇员的薪水最高,这是正确的吗?或实际上有四位这样的幸运员工)?
如果您使用rank()
,则子查询将在有平局的情况下返回排名中的差距,例如1st,2nd =,2nd =,4th,所以您不会获得任何第三名的结果。
另一方面,dense_rank()
之间没有任何纽带,例如: 1st,2nd =,2nd =,3rd。这就是为什么我在上面使用它。
对于记录,使用rownum
的等效查询将需要一个附加的嵌套子查询。
select * from (
select emp.*
, rownum as rn
from
( select * from hr.employees
order by salary desc) emp
)
where rn = 3
这与row_number()
解析解决方案具有相同的结果,即它忽略联系。
答案 1 :(得分:0)
对于您的情况,您需要在没有 order by 子句的子查询中确定rownum
:
select * from
(
select rownum as rn, ee.*
from (
select e.* from employees e order by salary desc
) ee
)
where rn=3;
P.S。如APC所言,使用分析功能会更好