首页 > 试题广场 > 查找当前薪水详情以及部门编号dept_no
[编程题]查找当前薪水详情以及部门编号dept_no
  • 热度指数:767106 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
有一个全部员工的薪水表salaries简况如下:



有一个各个部门的领导表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`));
请你查找各个部门当前领导的薪水详情以及其对应部门编号dept_no,输出结果以salaries.emp_no升序排序,并且请注意输出结果里面dept_no列是最后一列,以上例子输出如下:


关于为什么一定要两个表格的时间都限制成规定时间(9999-01-01)呢?
-----因为薪水表是按年发的,而题目要查找的是当前的薪水,所以要过滤掉以前,而dept_manager是因为有领导会离职,to_date时间不一定是9999-01-01,所以要过滤过离职的领导
发表于 2018-05-02 10:59:08 回复(21)
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 回复(65)
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 回复(60)
#由于输出顺序是按照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 回复(0)
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 回复(1)
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 回复(28)
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 回复(12)
用隐式内连接,显式内连接,和外连接均可。需要注意的是左外连接 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 回复(4)
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)
这个实在是太坑了,给的测试用例查询出来结果与指定结果数据少了一项,以为是这里的错误,结果是两个表的先后顺序搞反了导致的错误,记住,一定要先写salaries,再写dept_manager
发表于 2020-04-29 17:48:53 回复(2)
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 回复(3)
这题目感觉有问题,交换表的位置就不行了:
=============================================
可以的代码:
select s.*, d.dept_no
 from salaries s ,dept_manager d
where d.to_date = '9999-01-01'
and s.to_date = '9999-01-01'
and d.emp_no = s.emp_no
============================================
不可以的代码
select s.*, d.dept_no
 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

发表于 2017-09-12 15:38:18 回复(8)
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.*,
dept_no
from salaries s
right join dept_manager d
on s.emp_no = d.emp_no
order by s.emp_no;
发表于 2021-04-24 15:33:50 回复(0)
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 回复(2)
select salaries.emp_no,salary,from_date,salaries.to_date,dept_no
from salaries
join dept_manager on salaries.emp_no=dept_manager.emp_no
发表于 2021-03-20 02:38:57 回复(0)
select s.emp_no,s.salary,s.from_date,s.to_date,d.dept_no
from (
    select emp_no,
           dept_no
    from dept_manager
    where to_date='9999-01-01') d
left join(
    select emp_no,
           salary,
           from_date,
           to_date
    from salaries 
    where to_date='9999-01-01') s 
on s.emp_no=d.emp_no
order by s.emp_no;
发表于 2021-02-01 17:01:58 回复(0)
select s.*,d.dept_no from salaries s 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";

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;

编辑于 2021-01-06 16:32:25 回复(0)
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)