获取所有非manager员工当前的薪水情况

获取所有非manager员工当前的薪水情况

http://www.nowcoder.com/questionTerminal/8fe212a6c71b42de9c15c56ce354bebe

这里给出了四个表,每个表里都有一个主键emp_no,所以这里要注意的是每个表里的emp_no范围是否相同。
理论上来说,employees表里的数据应该是员工信息最全、最准确的,dept_emp、dept_manager中的emp_no是employees中的子集,salaries中的emp_no可能是employees中的子集,也可能包含一些未出现在employees中的信息。
题目要求的是非manager员工当前的薪水情况,关键是非manager员工如何确定,一个常规的思路是找出来dept_manager中的emp_no,然后再使用not in从employees表中筛选出非manager员工。

SELECT dept_emp.dept_no,employees.emp_no,salary
FROM employees
LEFT JOIN dept_emp
ON employees.emp_no=dept_emp.emp_no
LEFT JOIN salaries
ON employees.emp_no=salaries.emp_no
WHERE dept_emp.to_date='9999-01-01'
AND salaries.to_date='9999-01-01'
AND employees.emp_no NOT IN (
    SELECT emp_no
    FROM dept_manager
    WHERE to_date='9999-01-01')

评论区还有一种思路:使用left join求差集

SELECT dept_emp.dept_no,dept_emp.emp_no,salary
FROM salaries JOIN dept_emp
ON  dept_emp.emp_no=salaries.emp_no
LEFT JOIN dept_manager
ON dept_emp.emp_no=dept_manager.emp_no
WHERE salaries.to_date='9999-01-01'
AND dept_emp.to_date='9999-01-01'
AND dept_manager.dept_no IS NULL

这里如果增加条件:dept_manager.to_date='9999-01-01',则无法通过,删除了这个条件,虽然能通过,但是却并不准确,因为这个条件是限制当前还在做manager的员工,如果有些员工曾经做过manager,现在不再是manager,那么这部分员工就被一起剔除了。

全部评论
dept_manager.to_date='9999-01-01' 加在和表dept_manager的关联条件里,而不是加在where条件里(加在where条件里和AND dept_manager.dept_no IS NULL条件逻辑冲突,所以是无法通过的)
1 回复 分享
发布于 2021-03-10 14:37

相关推荐

uu们,拒offer时hr很生气怎么办我哭死
爱睡觉的冰箱哥:人家回收你的offer,或者oc后没给你发offer的时候可不会愧疚你,所以你拒了也没必要愧疚他。
点赞 评论 收藏
分享
评论
8
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务