当我们想要从一张桌子中选择一个员工的工资大于许多(比方说12)员工的工资时该怎么办。我知道我们必须使用子查询,但将其写成: -
Select ename,salary
from emp
where salary>( select salary
from emp
where ename='A'||ename='B'.....)
它可以这样写,但它不是一个好方法。请为它提出一些有用的查询。
答案 0 :(得分:1)
Select ename,salary
from emp
where salary > (
select salary
from
(
select
salary,
rownum as rn
from emp
order by salary
)
where rn = 12
)
答案 1 :(得分:1)
如果您了解12名员工,我认为您希望将查询编写为:
Select ename,salary
from emp
where salary> (select max(salary)
from emp
where ename in ('A', 'B', . . . )
)
IN
比一堆or
语句更方便。而且,子查询需要返回一个值,即最高工资。
答案 2 :(得分:0)
这不是您可能使用的确切代码,但它可以帮助您。
您可以使用RANK()函数。
来自article at oracle-base.com的示例:
SELECT empno,
deptno,
sal,
RANK() OVER (PARTITION BY deptno ORDER BY sal) "rank"
FROM emp;
EMPNO DEPTNO SAL rank
---------- ---------- ---------- ----------
7934 10 1300 1
7782 10 2450 2
7839 10 5000 3
7369 20 800 1
7876 20 1100 2
7566 20 2975 3
7788 20 3000 4
7902 20 3000 4
7900 30 950 1
7654 30 1250 2
7521 30 1250 2
7844 30 1500 4
7499 30 1600 5
7698 30 2850 6
答案 3 :(得分:0)
我可以看到对你的要求的两种不同的解释。
1。员工的收入超过12名其他(随机)员工
和
2。员工的收入超过12名特定员工
此查询解决了第一个要求,尽管它在较大的数据集上会变得很慢。
select *
from emp a
where 12 = (select count(*)
from emp b
where b.salary < a.salary);
此查询解决了第二个要求
select *
from emp
where salary > all(select salary
from emp
where emp_id in(1,2,3,4,5)
)