当子查询引用父级时,任何人都可以解释该查询。 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的行除外。
为什么?
因为将每一行的saldeptno的最高薪水进行比较,并且必须小于。
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,因为所有顶部的行均已被排除。

10-04 22:48