我想从一个表中的每个部门找到两个最高工资,这个部门有部门编号,工资和其他各种栏目。我得到了这个答案;它肯定有效,但我无法理解逻辑。
select *
from emp a where 2 > (select count( distinct(sal))
from emp
where sal > a.sal and a.deptno=deptno)
order by deptno;
答案 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;
以上更详细,但可能更容易遵循逻辑。