关于sql子查询
问题描述:
当我们想从一个表中选择一个雇员的薪水超过许多(可以说12)雇员的薪水时该怎么办。我知道,我们将不得不使用子查询但写它: -关于sql子查询
Select ename,salary
from emp
where salary>(select salary
from emp
where ename='A'||ename='B'.....)
它可以被写成这样的,但它不是一个好办法。请为它提供一些有用的查询。
答
如果你知道12名员工,我想你要编写查询为:
Select ename,salary
from emp
where salary> (select max(salary)
from emp
where ename in ('A', 'B', . . .)
)
IN
是远远超过了一堆更方便or
报表。而且,子查询需要返回一个值,即最高工资。
答
这不是您可以使用的确切代码,但它应该对您有所帮助。
您可以使用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
+0
谢谢回答,但它更像是找出员工的成绩。在我的情况下,我只需要选择薪水高于某些特定员工数量的员工。 – Zeb 2013-03-03 18:02:07
答
Select ename,salary
from emp
where salary > (
select salary
from
(
select
salary,
rownum as rn
from emp
order by salary
)
where rn = 12
)
答
我可以看到您的要求的两种不同的解释。
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)
)
非常感谢.....它工作:) – Zeb 2013-03-04 14:52:12