关于遍历整个层级结构直到顶层的SQL写法(以PostgreSQL为例)

        在项目中,经常会遇到遍历整个层级结构直到顶层这种情况,我们通常会在业务层通过代码进行处理,今天分享一种SQL写法,直接遍历整个层级结构直到顶层的结构。

        (1)、表结构示例

        本次测试的表为机构层级表名dept,表结构大致如下图:

(2)、查询语句编写

假设我们要查询的当前数据ID为:a4202e4153a541afa3462675d6c86cca,则写法如下:

WITH RECURSIVE DeptHierarchy AS (  
    -- Anchor member: 选择起始点  
    SELECT  
        id,
			  name,
        parentid,  
        ARRAY[id::text] AS path,  -- 显式地将id转换为text并创建数组  
        1 AS level  -- 当前节点的层级  
    FROM  
        department  
    WHERE  
        id = 'a4202e4153a541afa3462675d6c86cca'  -- 替换为起始的部门ID  
  
    UNION ALL  
  
    -- Recursive member: 递归地连接父级  
    SELECT  
        d.id,  
				d.name,
        d.parentid,  
        dh.path || d.id::text,  -- 将当前节点ID(转换为text)添加到路径数组的末尾  
        dh.level + 1  
    FROM  
        department d  
    JOIN DeptHierarchy dh ON d.id = dh.parentid  -- 连接当前层级与上一层级的CTE结果  
)  
SELECT id,name,path,level FROM DeptHierarchy;

注意,我在ARRAY[id::text] AS pathdh.path || d.id::text中使用了::text来确保id被转换为text类型,这是因为数组的元素类型需要一致。如果id已经是text类型,则不需要这种转换。但是,由于我们使用的是UUID格式的字符串作为ID,因此转换为text是安全的。

(3)、查看结果

        ID为a4202e4153a541afa3462675d6c86cca的层级查询祖先级,已知晓其只有上一个层级,查询结果展示如下:

数据排序依次往上,直至顶层。有了这个结果,那么在处理遍历的时候,就可以手到擒来了!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值