首页 > 试题广场 >

查找当前薪水详情以及部门编号dept_no

[编程题]查找当前薪水详情以及部门编号dept_no
  • 热度指数:980944 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
有一个全部员工的薪水表salaries简况如下:
emp_no
salary
from_date
to_date
10001
88958 2002-06-22
9999-01-01
10002
72527 2001-08-02
9999-01-01
10003
43311 2001-12-01 9999-01-01

有一个各个部门的领导表dept_manager简况如下:
dept_no
emp_no
to_date
d001 10001 9999-01-01
d002 10003 9999-01-01

请你查找各个部门当前领导的薪水详情以及其对应部门编号dept_no,输出结果以salaries.emp_no升序排序,并且请注意输出结果里面dept_no列是最后一列,以上例子输出如下:
emp_no salary from_date to_date dept_no
10001 88958 2002-06-22 9999-01-01 d001
10003 43311 2001-12-01 9999-01-01
d002
示例1

输入

drop table if exists  `salaries` ; 
drop table if exists  `dept_manager` ; 
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`));
CREATE TABLE `dept_manager` (
`dept_no` char(4) NOT NULL,
`emp_no` int(11) NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
INSERT INTO dept_manager VALUES('d001',10002,'9999-01-01');
INSERT INTO dept_manager VALUES('d002',10006,'9999-01-01');
INSERT INTO dept_manager VALUES('d003',10005,'9999-01-01');
INSERT INTO dept_manager VALUES('d004',10004,'9999-01-01');
INSERT INTO salaries VALUES(10001,88958,'2002-06-22','9999-01-01');
INSERT INTO salaries VALUES(10002,72527,'2001-08-02','9999-01-01');
INSERT INTO salaries VALUES(10003,43311,'2001-12-01','9999-01-01');
INSERT INTO salaries VALUES(10004,74057,'2001-11-27','9999-01-01');
INSERT INTO salaries VALUES(10005,94692,'2001-09-09','9999-01-01');
INSERT INTO salaries VALUES(10006,43311,'2001-08-02','9999-01-01');
INSERT INTO salaries VALUES(10007,88070,'2002-02-07','9999-01-01');

输出

10002|72527|2001-08-02|9999-01-01|d001
10004|74057|2001-11-27|9999-01-01|d004
10005|94692|2001-09-09|9999-01-01|d003
10006|43311|2001-08-02|9999-01-01|d002
select s.* ,d.dept_no
from salaries as s 
join dept_manager as d 
on s.emp_no=d.emp_no
where s.to_date = '9999-01-01'
    and    d.to_date='9999-01-01';

这里的坑主要在于两个表的逻辑关系,题目要求是薪水情况以及部门编号,再结合输出情况dept_no 被放到了最后一列,可见是主表是“salaries”。这里顺序错了就会提示:您的代码无法通过所有用例。。。
发表于 2018-01-28 16:24:12 回复(68)
关于为什么一定要两个表格的时间都限制成规定时间(9999-01-01)呢?
-----因为薪水表是按年发的,而题目要查找的是当前的薪水,所以要过滤掉以前,而dept_manager是因为有领导会离职,to_date时间不一定是9999-01-01,所以要过滤过离职的领导
发表于 2018-05-02 10:59:08 回复(25)
SELECT s.*, d.dept_no FROM salaries s ,  dept_manager d
WHERE s.to_date='9999-01-01'
AND d.to_date='9999-01-01'
AND s.emp_no = d.emp_no;

编辑于 2017-07-10 09:51:23 回复(59)
#由于输出顺序是按照emp_no递增来的,join时salaries表要放在前面,否则输出顺序不对
#由于两个表都有重复数据,所以两个表的to_date都要做限制
select salaries.emp_no,salaries.salary,salaries.from_date,salaries.to_date,dept_manager.dept_no
from salaries join dept_manager on dept_manager.emp_no = salaries.emp_no
where salaries.to_date = '9999-01-01' and dept_manager.to_date = '9999-01-01';
发表于 2017-10-09 11:57:05 回复(3)
SELECT d.dept_no,s.* FROM dept_manager d,salaries s 
WHERE s.to_date='9999-01-01' 
AND d.to_date='9999-01-01' 
AND s.emp_no = d.emp_no;
这个为什么是错的,因为显示出来和图上的要求不一样,dept_no变成在前面

发表于 2017-08-11 14:45:54 回复(13)
select salaries.emp_no,salaries.salary,salaries.from_date,salaries.to_date,dept_manager.dept_no 
from salaries inner join dept_manager
on dept_manager.emp_no = salaries.emp_no
where dept_manager.to_date = '9999-01-01' 
and salaries.to_date = '9999-01-01';
--------------------------
select salaries.emp_no,salaries.salary,salaries.from_date,salaries.to_date,dept_manager.dept_no 
from dept_manager  inner join salaries
on dept_manager.emp_no = salaries.emp_no
where dept_manager.to_date = '9999-01-01' 
and salaries.to_date = '9999-01-01';
---------------------------
只是换了一下表的顺序,上面的能成功,下面的却失败。是否对顺序有要求?
发表于 2017-07-10 11:30:44 回复(30)
select s.*, m.dept_no
from salaries as s inner join dept_manager as m 
    on s.emp_no = m.emp_no
    where s.to_date='9999-01-01' and m.to_date='9999-01-01'
order by emp_no asc;

  • 首先s中的表行肯定大于manager,因为s中除了m还有一般员工,可以用inner join完成表的链接,这样能确保框架表中的人员都是交集(manager)

  • 当前员工的筛选标准就是to_date

  • 最后记住orderby需要用本表中存在的字段,不能引用原表字段哦

发表于 2020-06-26 22:55:58 回复(5)
select s.*, d.dept_no
from salaries
s inner join dept_manager d
on s.emp_no = d.emp_no
发表于 2021-12-29 15:04:43 回复(2)
SELECT
	s.*,
	m.dept_no 
FROM
	dept_manager m
	LEFT JOIN salaries s ON m.emp_no = s.emp_no 
ORDER BY
	s.emp_no

发表于 2021-07-30 15:00:45 回复(2)
这个实在是太坑了,给的测试用例查询出来结果与指定结果数据少了一项,以为是这里的错误,结果是两个表的先后顺序搞反了导致的错误,记住,一定要先写salaries,再写dept_manager
发表于 2020-04-29 17:48:53 回复(4)
用隐式内连接,显式内连接,和外连接均可。需要注意的是左外连接 on后不能直接加and当作限制条件,显示外连接可以可以

隐式内连接
select t1.*,t2.dept_no
from salaries t1, dept_manager t2
where t1.to_date = '9999-01-01'
and t2.to_date = '9999-01-01'
and t1.emp_no = t2.emp_no;

显式外连接
select s.* ,d.dept_no
from salaries as s
join dept_manager as d
on s.emp_no=d.emp_no
and s.to_date = '9999-01-01'
and    d.to_date='9999-01-01';

左外连接
select s.*,d.dept_no
from salaries s
left join dept_manager d
on s.emp_no = d.emp_no
where s.to_date = '9999-01-01'
and d.to_date = '9999-01-01';

发表于 2020-03-13 22:07:54 回复(6)
select a.*,b.dept_no from salaries a,dept_manager b 
where a.emp_no=b.emp_no 
order by a.emp_no
这样不简单么,为啥好多人搞那么麻烦
发表于 2021-04-07 20:45:08 回复(3)
select s.emp_no, s.salary, s.from_date ,s.to_date ,d.dept_no 
from salaries s,dept_manager d 
where s.emp_no=d.emp_no order by s.emp_no
发表于 2021-04-24 22:48:28 回复(0)
select s.*, d.dept_no from salaries as s, dept_manager as d
where s.emp_no = d.emp_no and s.to_date = '9999-01-01';

在mysql下面这样就通过了。

编辑于 2017-10-29 10:45:46 回复(7)
select s.*,d.dept_no 
from salaries s
left/inner/right join dept_manager d 
on d.emp_no=s.emp_no
where s.to_date='9999-01-01'
and d.to_date='9999-01-01';
其实可以使用内来接,左外链接和右外连接,或不用连接来实现,几种连接的区别就是根据表不同
例如:左外连接主要侧重于左边连接
发表于 2017-07-10 22:17:24 回复(4)
SELECT s.*, d.dept_no
FROM salaries AS s
RIGHT JOIN dept_manager AS d
ON s.emp_no = d.emp_no

发表于 2022-06-30 16:24:53 回复(0)
小白,只会最基本的方法。。。
SELECT 
s.emp_no,
s.salary,
s.from_date,
s.to_date,
dm.dept_no
FROM salaries s
JOIN dept_manager dm
    ON s.emp_no = dm.emp_no

发表于 2021-08-23 21:31:04 回复(0)
 select s.*,d.dept_no from salaries s,dept_manager d
 where s.emp_no = d.emp_no
 group by s.emp_no order by s.emp_no


发表于 2021-07-08 11:35:18 回复(0)
SELECT s.*,d.dept_no 
FROM salaries AS s
INNER JOIN dept_manager AS d
ON s.emp_no = d.emp_no
WHERE s.to_date = '9999-01-01'
AND d.to_date = '9999-01-01';
发表于 2021-03-27 23:36:12 回复(1)
SELECT s.emp_no ,s.salary ,s.from_date ,s.to_date ,d.dept_no
FROM salaries s INNER JOIN dept_manager d 
ON s.emp_no = d.emp_no
AND d.to_date='9999-01-01' 
AND s.to_date='9999-01-01'
ORDER BY s.emp_no asc

第三题:主要考察做了一个内连接,然后剩下的按部就班把要素填好就好了。
发表于 2020-11-27 15:35:29 回复(1)