with as 递归实现

递归在获取上下级所有信息中使用很方便;

给定一个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。这种方法既冗杂又不稳定,不推荐,感兴趣的可以写写看。

posted @ 2020-07-30 13:36  大威1030  阅读(559)  评论(0)    收藏  举报