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

题目描述

获取所有部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary
CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL,
`dept_no` char(4) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));

输入描述:

输出描述:

 
dept_noemp_nosalary
d0011000188958
d0021000643311
d0031000594692
d0041000474057
d0051000788070
d0061000995409

示例1

输入

复制

输出

复制

--[编程题]获取所有部门中当前员工薪水最高的相关信息 
SELECT de.dept_no, de.emp_no, s.salary
FROM dept_emp de
	INNER JOIN salaries s
	ON (de.emp_no = s.emp_no
		AND de.to_date = '9999-01-01'
		AND s.to_date = '9999-01-01')
WHERE s.salary = (
	SELECT MAX(s2.salary)
	FROM dept_emp de2
		INNER JOIN salaries s2
		ON (de2.emp_no = s2.emp_no
			AND de2.to_date = '9999-01-01'
			AND s2.to_date = '9999-01-01')
	WHERE de2.dept_no = de.dept_no
	GROUP BY de2.dept_no
)
ORDER BY de.dept_no;
--第二种方法
SELECT re1.dept_no, re2.emp_no, re1.salary
FROM (
	SELECT dept_em.dept_no, MAX(em_sa.salary) AS salary
	FROM (
		SELECT emp_no, salary
		FROM salaries
		WHERE to_date = '9999-01-01'
	) em_sa
		LEFT JOIN (
			SELECT emp_no, dept_no
			FROM dept_emp
			WHERE to_date = '9999-01-01'
		) dept_em
		ON em_sa.emp_no = dept_em.emp_no
	GROUP BY dept_no
) re1
	JOIN (
		SELECT dept_em.dept_no, em_sa.emp_no, em_sa.salary AS salary
		FROM (
			SELECT emp_no, salary
			FROM salaries
			WHERE to_date = '9999-01-01'
		) em_sa
			LEFT JOIN (
				SELECT emp_no, dept_no
				FROM dept_emp
				WHERE to_date = '9999-01-01'
			) dept_em
			ON em_sa.emp_no = dept_em.emp_no
	) re2
	ON re1.dept_no = re2.dept_no
		AND re1.salary = re2.salary
ORDER BY re1.dept_no;
--第三种方法
SELECT d.dept_no, d.emp_no, s.salary
FROM dept_emp d
	JOIN salaries s ON d.emp_no = s.emp_no
WHERE d.to_date = '9999-01-01'
	AND s.to_date = '9999-01-01'
GROUP BY d.dept_no
HAVING MAX(s.salary);
--第四种方法
SELECT
	d.dept_no,
	d.emp_no,
	MAX( s.salary ) AS salary 
FROM
	dept_emp d,
	salaries s 
WHERE
	( d.emp_no = s.emp_no AND d.to_date = '9999-01-01' AND s.to_date = '9999-01-01' ) 
GROUP BY
	d.dept_no;
--第五种方法
/* 此题思路如下:
1、先用INNER JOIN连接两张表,限制条件是两张表的emp_no相同,即d.emp_no = s.emp_no;
2、选取每个员工当前的工资水平,用d.to_date = '9999-01-01' AND s.to_date = '9999-01-01'作条件限制,因为此表中每条最新记录的 to_date 都用 9999-01-01 表示;
3、用GROUP BY d.dept_no将每个部门分为一组,用MAX()函数选取每组中工资最高者;
4、将salaries用s代替,dept_emp用d代替,最后将MAX(s.salary)用salary代替后输出。 */
SELECT d.dept_no, s.emp_no, MAX(s.salary) AS salary
FROM salaries AS s INNER JOIN dept_emp As d
ON d.emp_no = s.emp_no 
WHERE d.to_date = '9999-01-01' AND s.to_date = '9999-01-01'
GROUP BY d.dept_no

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matthew_leung

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值