关于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报表。而且,子查询需要返回一个值,即最高工资。

+0

非常感谢.....它工作:) – Zeb 2013-03-04 14:52:12

这不是您可以使用的确切代码,但它应该对您有所帮助。

您可以使用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) 
        ) 
+1

对于第二个查询,我认为如果任何列出的员工的薪水为空,您需要澄清所需的行为。 – 2013-03-03 18:42:53

+0

@DavidAldridge好点! – Ronnis 2013-03-03 18:56:48

+0

嗯,我想我刚刚在优化器中发现了一个错误:) – Ronnis 2013-03-03 19:01:32