题目描述
描述 有一个员工表dept_emp简况如下:
有一个薪水表salaries简况如下:
获取每个部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary,按照部门编号升序排列,以上例子输出如下: (注意: Mysql与Sqlite select 非聚合列的结果可能不一样)
题解
题眼是要求同一个部门里的最高工资(按照部门号码升序展示)。
但是部门信息在表dept_emp,工资信息在表salaries,也就是说重要信息被分散在两张表中,两张表中能区分数据共有信息就是员工编号emp_no,怎么办?
最简单的想法就是,先把两张表中的部门信息和工资信息合为一张表,叫做new_table:
(式一)
SELECT d1.dept_no, d1.emp_no, s1.salary FROM dept_emp d1 JOIN salaries s1
ON d1.emp_no == s1.emp_no
AND d1.to_date = '9999-01-01' AND s1.to_date = '9999-01-01'
ORDER BY d1.dept_no;
合为一张表了之后再去找,就简化了,我们假设这张表叫做new_table,此时这张表new_table里有: 部门号dept_no,员工号emp_no,工资salary。我们需要把同一个部门中最高工资的员工信息取出,其他不要,可以有:
(式二)
SELECT dept_no, emp_no, salary FROM new_table
AND to_date = '9999-01-01'
WHERE salary IN (
SELECT MAX(salary) FROM new_table
AND to_date = '9999-01-01'
)
ORDER BY dept_no;
这就做完了,但是这里的new_table是我们自己假设的,实际上的new_table本身是两张表的合并(见上上个代码块),我们联立式一,式二,将new_table展开可以有:
(式三)
SELECT d1.dept_no, d1.emp_no, s1.salary FROM dept_emp d1 JOIN salaries s1
ON d1.emp_no == s1.emp_no
AND d1.to_date = '9999-01-01' AND s1.to_date = '9999-01-01'
WHERE s1.salary IN (
SELECT MAX(s2.salary) FROM dept_emp d2 JOIN salaries s2
ON d2.emp_no == s2.emp_no
AND d2.to_date = '9999-01-01' AND s2.to_date = '9999-01-01'
)
ORDER BY d1.dept_no;
由于WHERE连接的两张大表本身各自是由两张小表合并的,d1和s1是对齐了,d2和s2是对齐了,但是d1和s1 与d2和s2还没对齐,所以再按照部门信息取相等进行对齐即可WHERE d1.dept_no == d2.dept_no:
SELECT d1.dept_no, d1.emp_no, s1.salary FROM dept_emp d1 JOIN salaries s1
ON d1.emp_no == s1.emp_no
AND d1.to_date = '9999-01-01' AND s1.to_date = '9999-01-01'
WHERE s1.salary IN (
SELECT MAX(s2.salary) FROM dept_emp d2 JOIN salaries s2
ON d2.emp_no == s2.emp_no
AND d2.to_date = '9999-01-01' AND s2.to_date = '9999-01-01'
WHERE d1.dept_no == d2.dept_no
)
ORDER BY d1.dept_no;