我得到了一张员工表和一张部门表。表“雇员”缺少经理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);
答案 0 :(得分:4)
我能想到的唯一方法是从分别没有dep_id
manager_id
和null
的其他雇员那里获得manager_id
和dep_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
具有相同的管理者。