为啥此选择不选择任何行
Posted
技术标签:
【中文标题】为啥此选择不选择任何行【英文标题】:Why this select selects no rows为什么此选择不选择任何行 【发布时间】:2020-08-07 19:59:57 【问题描述】:我正在尝试选择“IT”部门的最高收入者,但我一直没有选择任何行。 薪水和姓名在名为employees 的表中,而department_name 在名为departments 的表中。 谁能解释一下为什么这不选择任何行,我应该怎么做?
SELECT first_name, last_name, salary, department_name
FROM employees
JOIN departments on departments.department_id = employees.department_id
WHERE salary = (SELECT max(salary) FROM employees WHERE department_name = 'IT');
【问题讨论】:
请标记您的 sql 引擎。 请分享示例数据 【参考方案1】:为什么这个选择没有选择行?
您的查询失败,因为employees
表中没有列department_name
。所以你的子查询没有做你所期望的:
where salary = (SELECT max(salary) FROM employees WHERE department_name = 'IT');
如果您想对子查询执行此操作,则需要关联它:
select e.first_name, e.last_name, e.salary, d.department_name
from employees e
inner join departments d on d.department_id = e.department_id
where
d.department_name = 'IT'
and e.salary = (select max(e1.salary)
from employees e1
where e1.department_id = e.department_id);
【讨论】:
【参考方案2】:如果 IT 部门有多个最高收入者,您可以使用dense_rank
。
select
first_name,
last_name,
salary,
department_name
from
(
select
first_name,
last_name,
salary,
department_name,
dense_rank() over (partition by department_name order by salary desc) as rnk
FROM employees e
JOIN departments d
on d.department_id = e.department_id
where department_name = 'IT'
) val
where rnk = 1
【讨论】:
这会选择所有部门中收入最高的人,而我只需要它是 IT 部门的人【参考方案3】:使用row_number()
:
SELECT t.*
FROM (SELECT emp.first_name, emp.last_name, dempt.salary, dempt.department_name,
ROW_NUMBER() OVER(PARTITION BY dept.department_name ORDER BY dept.salary DESC) AS SEQ
FROM employees emp JOIN
departments dept
ON dept.department_id = emp.department_id
WHERE dempt.department_name = 'IT'
) t
WHERE seq = 1;
如果薪水有关系,那么您可以改用rank()
。
【讨论】:
这会选择所有收入最高的员工,而我只需要 IT 部门的员工以上是关于为啥此选择不选择任何行的主要内容,如果未能解决你的问题,请参考以下文章