关于sql子查询

时间:2013-03-03 17:48:41

标签: sql oracle

当我们想要从一张桌子中选择一个员工的工资大于许多(比方说12)员工的工资时该怎么办。我知道我们必须使用子查询,但将其写成: -

Select ename,salary 
from emp 
where salary>( select salary
            from emp
           where ename='A'||ename='B'.....)

它可以这样写,但它不是一个好方法。请为它提出一些有用的查询。

4 个答案:

答案 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)
                   )