SQL SERVER 2005以前的版本只能用函數方法實現,SQL SERVER 2005以後新增了CTE功能,能夠利用CTE實現遞歸查詢;html
CTE:公用表達式Common Table Expression 是SQL SERVER 2005版本以後引入的一個特性;sql
1 Create table GroupInfo([Id] int,[GroupName] nvarchar(50),[ParentGroupId] int) 2 3 Insert GroupInfo 4 5 select 0,'某某大學',null union all 6 7 select 1,'外語學院',0 union all 8 select 2,'英語專業',1 union all 9 select 3,'日語專業',1 union all 10 select 4,'英語專業一班',2 union all 11 select 5,'英語專業二班',2 union all 12 select 6,'日語專業一班',3 union all 13 select 7,'日語專業二班',3 union all 14 15 select 8, '法學院',0 union all 16 select 9, '刑法學專業',8 union all 17 select 10,'經濟法學專業',8 union all 18 select 11,'刑法學專業一班',9 union all 19 select 12,'刑法學專業二班',9 union all 20 select 13,'經濟法學專業一班',10 union all 21 select 14,'經濟法學專業二班',10
1 --根據指定的節點向下獲取全部子節點 2 with 3 CTE 4 as 5 ( 6 select * from GroupInfo where Id=1 7 union all 8 select G.* from CTE inner join GroupInfo as G 9 on CTE.Id=G.ParentGroupId 10 ) 11 select * from CTE order by Id
1 --根據指定的節點向上獲取全部父節點 2 with 3 CTE 4 as 5 ( 6 select * from GroupInfo where Id=14 7 union all 8 select G.* from CTE inner join GroupInfo as G 9 on CTE.ParentGroupId=G.Id 10 ) 11 select * from CTE order by Id
1 --構造遞歸路徑 2 with 3 CTE 4 as 5 ( 6 select Id,GroupName,ParentGroupId,GroupPath=CAST( GroupName as nvarchar(max)) from GroupInfo where Id=1 7 union all 8 select G.*,CAST(CTE.GroupPath+'//'+G.GroupName as nvarchar(max)) as GroupPath from CTE 9 inner join GroupInfo as G 10 on CTE.Id=G.ParentGroupId 11 ) 12 select * from CTE
1 --經過id字段的字符串的拼接,造成sort字段,再經過sort排序,來實現同一分支上的節點放到一塊兒 2 WITH 3 CTE 4 AS 5 ( 6 SELECT * ,CAST(RIGHT('000' + CAST([Id] AS VARCHAR), 3) AS VARCHAR(MAX)) AS sort FROM GroupInfo 7 WHERE ParentGroupId = 0 8 UNION ALL 9 SELECT GroupInfo.* ,CAST(sort + RIGHT('000' + CAST(GroupInfo.[Id] AS VARCHAR),3) AS VARCHAR(MAX)) AS sort 10 FROM CTE 11 INNER JOIN GroupInfo ON CTE.Id = GroupInfo.ParentGroupId 12 ) 13 SELECT * FROM CTE ORDER BY sort
1 --查詢節點層級 2 WITH CTE AS ( 3 SELECT *,1 AS [Level] FROM GroupInfo WHERE ParentGroupId=0 4 UNION ALL 5 SELECT G.*,CTE.Level+1 FROM GroupInfo as G 6 JOIN CTE ON CTE.Id =G.ParentGroupId 7 ) 8 SELECT * FROM CTE
原文出處:https://www.cnblogs.com/willingtolove/p/10162587.html函數