无法理解查询

时间:2011-06-19 09:19:46

标签: mysql sql

我想从一个表中的每个部门找到两个最高工资,这个部门有部门编号,工资和其他各种栏目。我得到了这个答案;它肯定有效,但我无法理解逻辑。

select * 
from emp a where 2 > (select count( distinct(sal)) 
                      from emp 
                      where sal > a.sal and a.deptno=deptno)
order by deptno;

3 个答案:

答案 0 :(得分:5)

对于employee中的每一行,WHERE子句中的查询计算同一部门中有多少行具有更高的工资。然后WHERE子句本身将结果限制为那些工资较高的同一部门中有1行或0行(2 >)的工资 - 即最高的两个工资。

所以这个数据:

EmployeeId   Sal   DeptNo   No. of rows in the same department with higher salary
         1     1        1   3 (employees 2, 3 and 4)
         2     2        1   2 (employees 3 and 4)
         3     3        1   1 (employee 4)
         4     4        1   0
         5     1        2   2 (employees 6 and 7)
         6     2        2   1 (employee 7)
         7     3        2   0

...查询将选择员工3,4,6和7,因为他们是雇员少于2名且薪水高于他们的员工。

答案 1 :(得分:2)

内部选择返回给定员工在同一部门内的较高薪水数。现在,如果同一部门的薪水低于两个,那么给定的员工必须是部门内的最高收入或倒数第二的人。

答案 2 :(得分:0)

将子查询重新定位到SELECT子句,而没有“前2”限制(显然会获得更多行):

        select a.*, 
               (
                select count( distinct(sal)) 
                  from emp 
                 where sal > a.sal and a.deptno=deptno
               ) as tally
          from emp a   

然后,您可以使用WHERE子句限制结果集,从而引入更高级别,例如

select b.* 
  from (
        select a.*, 
               (
                select count( distinct(sal)) 
                  from emp 
                 where sal > a.sal and a.deptno=deptno
               ) as tally
          from emp a
       ) b     
 where b.tally < 2
 order 
    by b.deptno, b.tally;

以上更详细,但可能更容易遵循逻辑。