SQL层级表如何查询二级上级sup_supervisor及多层级上级实现
层级表多级上级查询方案
基础表信息
- 表名:
hierarchy,为存储人员直属汇报关系的SQL表 - 原生字段:
person:文本类型,存储人员姓名supervisor:文本类型,存储对应人员的直属上级
- 内置示例数据对应关系:
- Bob的直属上级为Alice
- Mary的直属上级为Susan
- Alice的直属上级为David
- David的直属上级为Mary
批量生成二级上级(sup_supervisor)字段方案
不需要逐人写嵌套子查询,通过表自连接即可一次性为全表生成二级上级字段,通用SQL语句如下:
SELECT t1.person, t1.supervisor, t2.supervisor AS sup_supervisor FROM hierarchy t1 LEFT JOIN hierarchy t2 ON t1.supervisor = t2.person;
逻辑说明
- 给同一张
hierarchy表分配两个别名:t1存储人员本身及其直属上级信息,t2用来匹配直属上级对应的更高层级关系 - 采用
LEFT JOIN而非内连接,是为了保留「直属上级无对应上级记录」的行:比如示例中Mary的直属上级是Susan,表内不存在Susan作为person的记录,匹配时该行的sup_supervisor会自动返回空值,完全符合需求 - 语句执行后返回结果和预期完全一致:
- Bob的
sup_supervisor为David - Mary的
sup_supervisor为空 - Alice的
sup_supervisor为Mary - David的
sup_supervisor为Susan
- Bob的
三级上级字段实现逻辑
要新增第四列存储第三层级上级(即sup_supervisor的直属上级,比如Bob的第三级上级为Mary),实现逻辑和查询二级上级完全一致,只需要额外增加一次表自连接即可,SQL示例:
SELECT t1.person, t1.supervisor, t2.supervisor AS sup_supervisor, t3.supervisor AS third_level_supervisor FROM hierarchy t1 LEFT JOIN hierarchy t2 ON t1.supervisor = t2.person LEFT JOIN hierarchy t3 ON t2.supervisor = t3.person;
提示:上述多表自连接写法仅适用于层级深度固定的场景。如果业务中汇报层级深度不固定,需要使用对应数据库支持的递归CTE语法实现通用层级遍历,不属于本问题覆盖范围。
内容的提问来源于stack exchange,提问作者Gal Yamay
相关产品推荐
相关产品推荐

