一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
查询结果