[英]SQL join manager from same table onto a row with their employees
首先,这是我制作的一个虚拟表,用于显示我正在使用的数据:
员工 | 标题 | 分配 | 电子邮件 |
---|---|---|---|
老板人 | 老板 | ○ | bp@电子邮件 |
约翰·史密斯 | 导师 | 一个 | 乔斯@电子邮件 |
简·史密斯 | 导师 | b | jas@电子邮件 |
里奥·梅西 | 员工 | 一个 | lm@电子邮件 |
阿曼达凯塞尔 | 员工 | 一个 | ak@电子邮件 |
德里克·杰特 | 员工 | b | dj@电子邮件 |
我想最终得到以下信息:
员工 | 标题 | 分配 | 电子邮件 | 主管名称 | 主管电子邮件 |
---|---|---|---|---|---|
老板人 | 老板 | ○ | bp@电子邮件 | 无效的 | 无效的 |
约翰·史密斯 | 导师 | 一个 | 乔斯@电子邮件 | 老板人 | bp@电子邮件 |
简·史密斯 | 导师 | b | jas@电子邮件 | 老板人 | bp@电子邮件 |
里奥·梅西 | 员工 | 一个 | lm@电子邮件 | 约翰·史密斯 | 乔斯@电子邮件 |
阿曼达凯塞尔 | 员工 | 一个 | ak@电子邮件 | 约翰·史密斯 | 乔斯@电子邮件 |
德里克·杰特 | 员工 | b | dj@电子邮件 | 简·史密斯 | jas@电子邮件 |
我已经查看并尝试了以下文档:
https://www.sqltutorial.org/sql-self-join/
SQL Server:LEFT JOIN EMPLOYEE MANAGER 关系
这里最大的区别之一是我没有任何员工或经理 ID 列可供使用。
如果您是部门的主管,即 John Smith 是部门 a 的主管,那么您管理部门 a 中的所有员工。 同时,所有的主管都对o部门的老板负责,而老板对任何人都没有回应。
这是迄今为止我尝试过的最好的代码:
select e.*, b.employee as supervisor, b.email as supervisor_email
from employees e, employees b
where b.division = e.division
and
b.title like '%supervisor%'
这让我很接近,它返回:
员工 | 标题 | 分配 | 电子邮件 | 主管名称 | 主管电子邮件 |
---|---|---|---|---|---|
约翰·史密斯 | 导师 | 一个 | 乔斯@电子邮件 | 约翰·史密斯 | 乔斯@电子邮件 |
简·史密斯 | 导师 | b | jas@电子邮件 | 简·史密斯 | jas@电子邮件 |
里奥·梅西 | 员工 | 一个 | lm@电子邮件 | 约翰·史密斯 | 乔斯@电子邮件 |
阿曼达凯塞尔 | 员工 | 一个 | ak@电子邮件 | 约翰·史密斯 | 乔斯@电子邮件 |
德里克·杰特 | 员工 | b | dj@电子邮件 | 简·史密斯 | jas@电子邮件 |
因此,它正确地获取了员工信息,但省略了 Boss 记录并将主管作为自己的主管。 我想我需要某种案例或 if 声明,但我不确定。
请让我知道这是否有意义或是否需要进一步澄清。
您可以尝试使用LEFT JOIN
并使用两个条件:
employee < supervisor
supervisor < boss
我是这样做的:
SELECT t1.*,
t2.employee,
t2.email
FROM tab t1
LEFT JOIN tab t2
ON (t1.division = t2.division AND
t2.title = 'supervisor' AND
t1.title = 'employee')
OR (t2.title = 'boss' AND
t1.title = 'supervisor')
你会在这里找到一个 SQL 小提琴。
如果要更新当前表(如果列可用),可以执行以下操作(与@lemon 大致相同):
UPDATE testing t1 JOIN testing t2 ON t2.`division`=t1.division OR t2.division="o" SET
t1.supervisor_name=t2.`employee`, t1.supervisor_email=t2.email
WHERE (CASE
WHEN t1.`title`="employee" THEN t2.title="supervisor"
WHEN t1.`title`="supervisor" THEN t2.title="boss"
END);
SELECT * FROM testing;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.