首页 > 试题广场 >

获取所有部门当前manager的当前薪水情况,给出dept_

[编程题]获取所有部门当前manager的当前薪水情况,给出dept_
  • 热度指数:256940 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
获取所有部门当前(dept_manager.to_date='9999-01-01')manager的当前(salaries.to_date='9999-01-01')薪水情况,给出dept_no, emp_no以及salary,输出结果按照dept_no升序排列(请注意,同一个人可能有多条薪水情况记录)
CREATE TABLE `dept_manager` (
`dept_no` char(4) NOT NULL,
`emp_no` int(11) 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`));


输入描述:

示例1

输入

输出

此题与前面第三题类似,思路如下:
1、先用INNER JOIN连接两张表,限制条件是两张表的emp_no相同,即d.emp_no = s.emp_no,并且将salaries用别名s代替,dept_manager用别名d代替
2、根据题意,要获取当前manager的当前salary情况,再加上限制条件d.to_date = '9999-01-01' AND s.to_date = '9999-01-01'即可(因为同一emp_no在salaries表中对应多条涨薪记录,而当s.to_date = '9999-01-01'时是该员工当前的薪水记录)
SELECT d.dept_no, d.emp_no, s.salary 
FROM salaries AS s INNER JOIN dept_manager AS d 
ON d.emp_no = s.emp_no
AND d.to_date = '9999-01-01'
AND s.to_date = '9999-01-01'
ORDER BY d.dept_no




编辑于 2020-11-07 15:02:32 回复(54)

这一题应该用左连接或者右连接查询,其实题目的意思是如果对应的部门经理有工资的话,就显示出来,没有的话,salary就置为空。

SELECT d1.dept_no, d1.emp_no, s1.salary FROM dept_manager d1 LEFT JOIN salaries s1 ON d1.emp_no = s1.emp_no AND s1.to_date = '9999-01-01' WHERE d1.to_date = '9999-01-01';

这个语句的含义是:先执行ON语句筛选出所有部门经理的当前工资,其中d1.emp_no = s1.emp_no指的是在s1表里找到对应的部门经理的工资,但部门经理会有很多工资(会涨薪么),所以再添加一个s1.to_date = '9999-01-01'。
至于最后一个d1.to_date = '9999-01-01'是干什么的呢,小伙伴们可能还记得,left join会显示左表的所有数据,那么这个经理离职了也会显示出来(和前面的没有工资可不一样),就比如d005就是这个情况,但现在我们要把它过滤掉,因此需要这个语句;图片说明

发表于 2018-08-08 15:51:17 回复(13)
select dm.dept_no,dm.emp_no ,s.salary from salaries as s  inner join dept_manager as dm  on dm.emp_no= s.emp_no 
where s.to_date ='9999-01-01';
这是一个错误样例,条件一定要写全。。。。
发表于 2017-08-10 07:28:10 回复(8)
方法一:直接用where限定条件:
select d.dept_no,d.emp_no,s.salary
from dept_manager d,salaries s
where d.emp_no = s.emp_no
and d.to_date = s.to_date
and s.to_date='9999-01-01'

方法二:用join联结:
select d.dept_no,d.emp_no,s.salary
from dept_manager d
join salaries s
on d.emp_no = s.emp_no
and d.to_date = s.to_date
where s.to_date='9999-01-01'

发表于 2019-08-11 10:53:42 回复(5)
三种写法  注意left join 时的where和on的区别即可。
select d.dept_no,d.emp_no,s.salary from dept_manager d left join 
   (select * from salaries where to_date='9999-01-01') s
     on d.emp_no=s.emp_no where d.to_date='9999-01-01' 


select d.dept_no,d.emp_no,s.salary from dept_manager d left join 
    salaries s on d.emp_no=s.emp_no where d.to_date='9999-01-01' and s.to_date='9999-01-01'
       

select d.dept_no,d.emp_no,s.salary from dept_manager d left join 
    salaries s on d.emp_no=s.emp_no and d.to_date='9999-01-01' and s.to_date='9999-01-01' 
             where s.salary is not null


发表于 2020-06-09 20:56:33 回复(0)
SELECT d.dept_no,d.emp_no,s.salary
FROM dept_manager d,salaries s
WHERE d.emp_no=s.emp_no
AND d.to_date='9999-01-01'
AND s.to_date='9999-01-01'

发表于 2019-04-01 16:52:48 回复(0)
1、关键词:当前部门当前薪水
2、语句
select d.dept_no, d.emp_no, s.salary
from dept_manager 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'
发表于 2020-08-02 13:08:59 回复(0)
select d.dept_no,d.emp_no,s.salary
from salaries s left join dept_manager d on d.emp_no = s.emp_no
where d.to_date = '9999-01-01' and s.to_date = '9999-01-01';

解题思路:关键点是dept_manager表的to_date和salaries表的to_date都要等于'9999-01-01',s.to_date = '9999-01-01'容易理解,限定当前时间当前工资,d.to_date = '9999-01-01'则限定在职经理,注意理解题目,有两个“当前”。
发表于 2019-11-27 10:05:57 回复(1)

有一个思路是其中一个表先创建一个筛选后的temp_table,再和剩下的主表inner join,能节省merge的时间

select dept_no, d.emp_no, s.salary
from dept_manager d inner join 
(  select emp_no, salary, to_date  from salaries  where to_date = '9999-01-01'
) s 
where d.emp_no = s.emp_no and d.to_date = s.to_date
order by d.emp_no;
编辑于 2018-06-24 11:57:10 回复(0)

select dm.dept_no, dm.emp_no, sl.salary
from salaries sl
inner join dept_manager dm
on dm.emp_no = sl.emp_no and dm.to_date = '9999-01-01'
and sl.to_date = '9999-01-01';

-- --

select dm.dept_no, dm.emp_no, sl.salary
from dept_manager dm
inner join salaries sl
on dm.emp_no = sl.emp_no and dm.to_date = '9999-01-01'
and sl.to_date = '9999-01-01';

两段代码 只是换了表的顺序 输出不一样,内连接对表的顺序有要求吗

发表于 2017-07-08 14:52:06 回复(5)
select d.dept_no,d.emp_no,s.salary
from  dept_manager d inner join  salaries s
on d.emp_no=s.emp_no and d.to_date='9999-01-01' and s.to_date='9999-01-01'
有毒啊 这为啥通不过
发表于 2017-07-13 17:57:53 回复(6)
select b.dept_no,a.emp_no,a.salary
from dept_manager b
left join salaries a on a.emp_no = b.emp_no
where b.to_date='9999-01-01' and a.to_date='9999-01-01'
order by b.dept_no asc
发表于 2021-01-13 20:42:41 回复(1)
有两种思路:
一种是单表,一种是内连接:
思路就是:两张表里都存在emp_no即可。
1、
select d.dept_no,d.emp_no,s.salary from dept_manager d,salaries s
where d.to_date='9999-01-01' and s.to_date='9999-01-01' and d.emp_no = s.emp_no
order by d.dept_no asc;
2、
select d.dept_no,d.emp_no,s.salary from dept_manager d inner join
salaries s on d.to_date = '9999-01-01' and s.to_date='9999-01-01' and d.emp_no=s.emp_no
order by d.dept_no asc;
经过测试,内连接快一丢丢。
发表于 2020-11-25 17:16:12 回复(0)
select
    d.dept_no,d.emp_no,s.salary
from
    dept_manager d join salaries s
on 
    d.emp_no=s.emp_no and d.to_date=s.to_date
where 
    d.to_date='9999-01-01';
这道题就是单纯考察两张表的连接
发表于 2020-07-08 22:04:13 回复(0)
select dept_no,m.emp_no,salary
from dept_manager m
inner join salaries s on m.emp_no=s.emp_no
where m.to_date='9999-01-01' and s.to_date='9999-01-01';

发表于 2020-06-06 10:56:34 回复(0)
SELECT d.dept_no, d.emp_no, s.salary
FROM (SELECT*FROM dept_manager WHERE to_date='9999-01-01') AS d
LEFT JOIN (SELECT*FROM salaries WHERE to_date='9999-01-01') AS s ON d.emp_no = s.emp_no;
三行!!
发表于 2020-01-30 20:51:01 回复(0)

select d.dept_no,d.emp_no,s.salary from dept_manager as d
inner join  salaries as s on d.to_date =s.to_date and d.emp_no =s.emp_no
where d.to_date = '9999-01-01';

发表于 2019-09-01 11:54:14 回复(0)
select m.dept_no,m.emp_no,s.salary
from 
salaries s join dept_manager m
on s.emp_no=m.emp_no
where m.to_date='9999-01-01'
and s.to_date='9999-01-01'
order by m.emp_no;
发表于 2019-08-14 10:41:00 回复(1)
SELECT d.dept_no, d.emp_no, s.salary FROM dept_manager AS d
JOIN salaries AS s
ON d.emp_no = s.emp_no
WHERE s.to_date = '9999-01-01' AND d.to_date = '9999-01-01';
发表于 2019-06-18 10:57:34 回复(0)
select d.dept_no, d.emp_no, s.salary from dept_manager as d
inner join salaries as s
on d.emp_no = s.emp_no and s.to_date = d.to_date
where s.to_date = "9999-01-01";
发表于 2018-09-14 18:48:59 回复(0)