给定雇员和部门表找到缺少的部门ID

时间:2019-09-04 11:15:20

标签: mysql

我得到了一张员工表和一张部门表。表“雇员”缺少经理ID和部门ID。表的结构在下面的小提琴中。 我被要求找到那些丢失的部门ID。从我看来,一位经理可以与多个部门合作。 没有进一步的假设。这就是我尝试过的。但这是不正确的。没有更多有关此问题的信息,是否可以解决? 我还假设没有丢失数据的硬编码。

select 
e.name as emp_name,
d.name as dep_name,
Dep_id, Manager_id, 
Salary
from Employees as e 
left join departments as d
on d.id=e.dep_id
order by Salary  desc;

http://sqlfiddle.com/#!9/f8fa05

CREATE TABLE IF NOT EXISTS `departments` (
  `id` int(6) unsigned NOT NULL,
  `name` varchar(200),
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `departments` (`id`, `name`) VALUES
  ('1', 'Finance'),
  ('2', 'Operations'),
  ('3', 'Deployment');
CREATE TABLE IF NOT EXISTS `employees` (
  `id` int(6) unsigned NOT NULL,
  `name` varchar(200),
  `Dep_id` int(6) unsigned ,
  `Manager_id` int(6) unsigned,
  `Salary` int ,

  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `employees` (`id`, `name`, `Dep_id`, `Manager_id`, `Salary`) VALUES
  ('1', 'John Smith',1,NULL,2000 ),
  ('2', 'Jack Smith',NULL,1, 1500),
  ('3', 'Becky Smith',1,2,2000),
  ('4', 'Rebecca Smith',2,2,700),
  ('5', 'Sonny Smith',3,1,3000);

1 个答案:

答案 0 :(得分:4)

我能想到的唯一方法是从分别没有dep_id manager_idnull的其他雇员那里获得manager_iddep_id
如果您说:一个经理可以与多个部门合作,那么这并不是一个唯一的解决方案,这就是为什么我使用汇总选择其中一个部门的原因:

select 
  e.id, e.name, 
  max(coalesce(e.dep_id, ee.dep_id)) dep_id, 
  max(coalesce(e.manager_id, ee.manager_id)) manager_id, 
  e.salary
from employees e 
left join employees ee on ee.dep_id = e.dep_id or ee.manager_id = e.manager_id
group by e.id, e.name, e.salary
order by e.id

如果表很大,则将查询分​​为两部分(以避免对所有行进行联接和聚合),然后将UNION ALL用于最终结果会更有效:

select e.* from employees e 
where e.dep_id is not null and e.manager_id is not null
union all
select 
  e.id, e.name, 
  max(coalesce(e.dep_id, ee.dep_id)) dep_id, 
  max(coalesce(e.manager_id, ee.manager_id)) manager_id, 
  e.salary
from employees e 
left join employees ee on ee.dep_id = e.dep_id or ee.manager_id = e.manager_id
where e.dep_id is null or e.manager_id is null
group by e.id, e.name, e.salary
order by id

请参见demo
结果:

id | name          | dep_id | manager_id | salary
-: | :------------ | -----: | ---------: | -----:
 1 | John Smith    |      1 |          2 |   2000
 2 | Jack Smith    |      3 |          1 |   1500
 3 | Becky Smith   |      1 |          2 |   2000
 4 | Rebecca Smith |      2 |          2 |    700
 5 | Sonny Smith   |      3 |          1 |   3000

所以'John Smith'之所以得到manager_id = 2,是因为'Becky Smith'在同一个部门中并且拥有这个manager_id
另外,'Jack Smith'之所以得到dep_id = 3,是因为'Sonny Smith'dep_id具有相同的管理者。