SQL SERVER 递归




一1.SQL简单递归

-- with一个临时表
;WITH T AS 
(
	--1:初始查询(这里的 CodeSq = 13在我的数据中是最底层的根节点 level为节点的层级)
	SELECT CodeSq,Mcode,Dcode,CodeName,1 as level 
	FROM dbo.Shun416_Code 
	WHERE  CodeSq = 13
	UNION ALL
	--2:递归条件
	SELECT R1.CodeSq,R1.Mcode,R1.Dcode,R1.CodeName,T.level+1 as level 
	--3:这里的临时表和原始数据表都必须使用别名,不然递归的时候不知道查询的是那个表的列
	FROM dbo.Shun416_Code R1 
	JOIN T ON R1.Mcode = T.Dcode--这个关联关系很重要,一定要理解一下谁是谁的父节点
)
--4:递归完成后 一定不要少了这句查询语句 否则会报错
SELECT * FROM T

这里要注意的地方是注释中的 1——4 的部分

查询的结果:


--2.SQL递归层级间带缩进

;WITH T AS 
(
	--1:初始查询(这里的 CodeSq = 13在我的数据中是最底层的根节点)
	SELECT CodeSq,Mcode,Dcode,CodeName,1 as level 
	FROM dbo.Shun416_Code 
	WHERE  CodeSq = 13
	UNION ALL
	--2:递归条件
	SELECT R1.CodeSq,R1.Mcode,R1.Dcode,
CONVERT(nvarchar(1000),CONVERT(nvarchar(1000),REPLICATE('    ',T.level+1)+R1.CodeName)) As CodeName
 ,T.level+1 as level 
	--这里的这里的 REPLICATE函数非常重要,用于缩进空格用。
	--3:这里的临时表和原始数据表都必须使用别名,不然递归的时候不知道查询的是那个表的列
	FROM dbo.Shun416_Code R1 
	JOIN T ON R1.Mcode = T.Dcode--这个关联关系很重要,一定要理解一下谁是谁的父节点
)
--4:递归完成后 一定不要少了这句查询语句 否则会报错
SELECT * FROM T
查询结果





打赏

取消 我去学网

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少
微信

打开微信扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

  1. #2

    木庄网络博客(2016/10/28 11:41:03)
    不错的网站主题,看着相当舒服

  2. #1

    木庄网络博客(2016/10/14 21:02:39)
    博客做得好漂亮哦!