【问题标题】: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 引擎。
  • 请分享示例数据

标签: sql oracle select subquery greatest-n-per-group


【解决方案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 部门的员工
    猜你喜欢
    • 2020-05-02
    • 2020-11-10
    • 1970-01-01
    • 2012-07-05
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 2016-06-30
    相关资源
    最近更新 更多