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