sql server递归查询

本文介绍如何使用SQL自连接来查询每个节点间的层级关系。通过CTE(公共表表达式)递归构建从父节点到子节点的路径,并展示不限定起始条件时如何获取所有层级的关系。最后,通过DENSE_RANK函数筛选出每组父子节点的最大层级,确保结果一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如下图,查询每个节点之间的关系,以及层级
请添加图片描述表中存储的数据如下:
在这里插入图片描述
数据类型:
在这里插入图片描述

1、查询每个节点之间的关系,以及层级

逻辑:
该表自连接,son_id 与 father_id 相等,一步一步连接下去

WITH cte(son_id, father_id, ReportPath, Level) AS
(
    SELECT son_id, father_id, CAST(son_id + '->' + father_id AS NVARCHAR(max)) AS ReportPath,2 AS Level FROM test where father_id = 0
    UNION ALL
    SELECT c.son_id, c.father_id, c.son_id+ '->'+ P.ReportPath AS ReportPath , p.Level+1 AS Level
    FROM cte P INNER JOIN test c ON P.son_id = c.father_id
    
)
SELECT *  FROM cte ORDER BY son_id;

在这里插入图片描述

2、不限制 where father_id = 0 这个起始条件

则会出现每一层的关系,然后用son_id,father_id 分组后取最大的层级即可

WITH cte(son_id, father_id, ReportPath, Level) AS
(
    SELECT son_id, father_id, CAST(son_id + '->' + father_id AS NVARCHAR(max)) AS ReportPath,2 AS Level FROM test 
    UNION ALL
    SELECT c.son_id, c.father_id, c.son_id+ '->'+ P.ReportPath AS ReportPath , p.Level+1 AS Level
    FROM cte P INNER JOIN test c ON P.son_id = c.father_id
    
)
SELECT * into test_tree FROM cte ORDER BY son_id;

在这里插入图片描述

select * from (
select * ,DENSE_RANK( )over(partition by son_id,father_id order by Level desc) as rn from test_tree)t
where rn =1

排序后获取结果与有限制条件的结果一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值