当子查询引用父级时,任何人都可以解释该查询。 SQL如何考虑这一点
员工第二高的工资:
select max(e1.sal),e1.deptno
from s_emp e1
where sal < (select max(sal) from s_emp e2 where e2.deptno = e1.deptno)
group by e1.deptno;
我测试了它,而且效果很好。
最佳答案
首先删除group by和aggegation,然后考虑以下查询:
select e1.sal, e1.deptno
from s_emp e1
where e1.sal < (select max(sal) from s_emp e2 where e2.deptno = e1.deptno)
它返回表的所有行,但在它们的
sal
中具有最大deptno
的行除外。为什么?
因为将每一行的
sal
与deptno
的最高薪水进行比较,并且必须小于。WHERE
子句中的子查询对表的每一行执行一次:select max(e2.sal) from s_emp e2 where e2.deptno = e1.deptno
对于每一行,它返回当前行
sal
的最大deptno
。因此,结果是所有
sal
均小于当前行sal
的最大deptno
。现在,如果添加
group by deptno
和聚合,则将为每个deptno
返回的行的最大sal
,这是每个sal
第二高的deptno
,因为所有顶部的行均已被排除。