繁体   English   中英

SQL将经理从同一张表加入到他们的员工所在的一行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM