浅析数据库递归

浏览: 2145
[导读]
今天主要是简单讲一下递归在数据库中的应用。递归算法是计算机算法中最基础的算法之一,每个做开发的同学都应该掌握, […]

今天主要是简单讲一下递归在数据库中的应用。递归算法是计算机算法中最基础的算法之一,每个做开发的同学都应该掌握,而且在我们的实际工作中也会经常遇到,比如大型集团公司部门这种树形结构,要获取或者查询某个部门的下级所有部门或者上级部门就会用到递归查询!下面来简单演示一下~~~~
不擅长写文章,说的不好的地方,请见谅~ 

首先,假如我有如下一个表结构:

DECLARE @TABLE TABLE (
ID INT NULL,
ParentID INT NULL )
INSERT INTO @TABLE
SELECT 10000,-1
UNION ALL
SELECT 13551,10000
UNION ALL
SELECT 15,13551
UNION ALL
SELECT 245,15
UNION ALL
SELECT 5555,10000
UNION ALL
SELECT 88,5555
UNION ALL
SELECT 255,88
UNION ALL
SELECT 6666,10000
UNION ALL
SELECT 999,6666
UNION ALL
SELECT 444,999
UNION ALL
SELECT 278,444;
SELECT * FROM @TABLE;

所产生的结果如下图:
 

现在我想获取到该表的第二层节点、ID所在该递归中占的级别以及获取各个ID的父子结构,这里使用SQLSERVER新推出的CTE递归功能来解决。如:

WITH MU
AS (SELECT ID,
PARENTID,
CONVERT(VARCHAR(MAX), ID) AS PATH,
1 AS LEVEL
FROM @TABLE
WHERE PARENTID = -1 --固定变量
UNION ALL
SELECT T1.ID,
T1.PARENTID,
T2.PATH + ',' + Ltrim(T1.ID),
LEVEL + 1
FROM @TABLE T1
INNER JOIN MU T2
ON T1.PARENTID = T2.ID)
SELECT CASE
WHEN LEVEL > 2 THEN LEFT(Stuff(PATH, 1, Charindex(',', PATH), ''), Charindex(',', Stuff(PATH, 1, Charindex(',', PATH), '')) - 1)
WHEN LEVEL = 2 THEN ID
ELSE NULL
END AS '第二层节点',
*
FROM MU

所得结果如下:

     

整个过程:
1.将 CTE 表达式拆分为定位点成员和递归成员。
2.运行定位点成员,创建第一个调用或基准结果集 (T0)。
3.运行递归成员,将 Ti 作为输入(这里只有一条记录),将 Ti+1 作为输出。
4.重复步骤 3,直到返回空集。
5.返回结果集。这是对 T0 到 Tn 执行 UNION ALL 的结果。

最后,希望这篇文档对你有作用,有任何不对的地方请指正,有任何问题请直接在下方留言,一起交流,一起学习进步!

推荐 0
本文由 天善智能 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册