递归在获取上下级所有信息中使用很方便;
给定一个tableA (id ,name,superid) superid是id的上级,superid同时也是table表中的id,id又会有superid上级,类推。另外table中会有一个最高(低)级的id,在之上(下)没有更高的superid。这种结构的表满足递归的方法使用情景。
递归使用的两个约束:一是自顶(底)有一条完整连贯的分支链;二是有顶(底)点,也就是递归结束标志,否则容易造成死循环。
下例为获取id=100的以下所有分支id信息。
WITH T_Classify(id,Name,SuperID)
AS
(
--给定递归结束标志,遍历到顶点=100结束
select Name,ID,0 from tableA where ID=100
--自身遍历
union all
SELECT b.id,b.Name,b.SuperID
FROM tableA as b
INNER JOIN T_Classify ON b.superid = T_Classify.id
)
--取出结果集
select * from T_Classify
使用非递归方法需要自身left join 多层(保险起见,大于最小支点到最高支点的层数),而且后续又增加层数,代码还要调整,继续left join。这种方法既冗杂又不稳定,不推荐,感兴趣的可以写写看。
原文:https://www.cnblogs.com/2019-11-11/p/13403274.html