假设我们有2个数据库表- emp
以及 dept
,它由以下列组成 emp
:empid、deptid、salary dept
:deptid,deptname
中的deptid列 emp
可以与中的deptid列联接 dept
列。请注意,有些部门没有员工。对于这些情况,deptid dept
表不存在于 emp
table。我们需要找到每个部门的最高工资。对于没有任何员工的部门,我们需要从 emp
table。一个要求是我们不能使用子查询,但允许使用cte(公共表表达式)。
下面是我构建的查询:
with cte as
(Select d.deptid, e.salary, row_number() over (partition by d.deptid order by e.salary desc) as rnk,
row_number() over(order by e.salary desc) as salary_rank
from emp e
join dept d on e.deptid = dept.deptid),
top_salary as
(Select d.deptid, e.salary
from emp e
join dept d on e.deptid = dept.deptid
order by e.salary desc
limit 1)
(Select d.deptid, cte.salary
from cte
join dept d on d.deptid = cte.deptid
where cte.rnk = 1) as t1
UNION
(Select d.deptid, ts.salary
from dept d
left join cte on cte.deptid = d.deptid
left join top_salary ts on ts.deptid = cte.deptid
where cte.salary is null
)
但我不确定我做得是否正确,尤其是在部门没有员工的情况下。我也不确定我写的关于 UNION
子句被视为子查询。如果它们确实是子查询,那么有没有一种方法可以重写该查询而不使用任何子查询?
1条答案
按热度按时间b0zn9rqh1#
我们需要找到每个部门的最高工资。对于没有员工的部门,我们需要从emp表中为他们分配最高的工资。
你的尝试似乎过于复杂:
基本思想是计算每个部门的最高工资,然后“默认”为总体最高工资。
顺便说一句,您只能使用联接来执行此操作:
我不推荐这种方法,但您可能想了解它。