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