牛客网:数据库SQL实战

[编程题]获取所有部门中当前员工薪水最高的相关信息

链接:https://www.nowcoder.com/questionTerminal/4a052e3e1df5435880d4353eb18a91c6?toCommentId=2532561
来源:牛客网

此题目中,需要注意GROUP BY语句之后必须出现SELECT语句中出现的所有非聚集函数列,否则会产生不匹配的问题。

测试使用前8个职员的数据。(网站用例没看到第九个及之后的完整salaries信息)。解题思路是首先将需要的信息联结成一张表,使用语句:

select d.dept_no,d.emp_no,s.salary
         from dept_emp as d
             join salaries as s
                 on d.emp_no = s.emp_no
                     and d.to_date='9999-01-01'
                         and s.to_date ='9999-01-01'

查询结果:
牛客网:数据库SQL实战_第1张图片

//然后对此表进行查询
select jtable.dept_no,jtable.emp_no,MAX(jtable.salary)
from (select d.dept_no,d.emp_no,s.salary
         from dept_emp as d
             join salaries as s
                 on d.emp_no = s.emp_no
                     and d.to_date='9999-01-01'
                         and s.to_date ='9999-01-01')as jtable
group by jtable.dept_no;

查询结果如下:
牛客网:数据库SQL实战_第2张图片
可以看到选中行的列信息并不匹配(d004部门薪资最高值的emp_no为10004而不是10003),虽然这样可以通过牛客的测试。但是如何真正解决这个问题呢?求评论!

   如果在SELECT语句中的非聚集函数列在GROUP BY语句中没有出现,假设在聚集时选取聚集簇的第一行,那么,可以提供一种思路:
    select d.dept_no,d.emp_no,s.salary
             from dept_emp as d
                 join salaries as s
                     on d.emp_no = s.emp_no
                         and d.to_date='9999-01-01'
                             and s.to_date ='9999-01-01'
                                  order by s.salary desc;
           --对联结表的结果做排序处理,这样可以保证同一部门中薪资高的员工信息总是出现在上面

你可能感兴趣的:(编程测试,数据库)