为啥此选择不选择任何行

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 部门的员工

以上是关于为啥此选择不选择任何行的主要内容,如果未能解决你的问题,请参考以下文章

为啥 jQuery 不选择所有属性元素?

为啥我的 Java 自定义单元格渲染器在选择行/单元格时不显示突出显示?

当我们不传递任何命令行参数时,为啥我们不会得到错误?

为啥这个引导日期选择器不显示日期选择器?

单击不会在uitableview ios 7中选择行

VBA选择不返回任何行