这里给出了四个表,每个表里都有一个主键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,那么这部分员工就被一起剔除了。