如何使用SQL查询所有员工的隔级上级(skip level manager)信息
问题原因分析
你原查询的自连接条件逻辑完全错误,用b.mgrid > a.mgrid的数值大小比较,和上下级层级关系没有关联,自然拿不到正确结果。
隔级上级的核心逻辑是:员工A的直接上级是B,B的直接上级就是A的隔级上级,还需要兼容两个边界场景:
- 员工的直接上级已经是最高级(无上级),隔级上级取该直接上级
- 员工本身就是最高级,隔级上级返回null
修正后的查询语句
SELECT a.Empid, COALESCE(b.Mgrid, a.Mgrid) AS SkipLevelMgr FROM emp a LEFT JOIN emp b ON a.Mgrid = b.Empid ORDER BY a.Empid;
逻辑说明
- 用
LEFT JOIN做自连接,关联条件为员工a的直接上级ID(a.Mgrid)等于上级员工的ID(b.Empid),此时查询到的b.Mgrid就是正常场景下a的隔级上级 - 用
COALESCE函数处理边界:如果b.Mgrid为null(即a的直接上级已经是最高级,无上级),就直接返回a的直接上级作为隔级上级,符合示例中empid=7返回8的要求 - 本身是最高级的员工(
empid=8),a.Mgrid本身为null,返回结果也为null,符合预期
内容的提问来源于stack exchange,提问作者user16714516
相关产品推荐
相关产品推荐

