| USE AdventureWorks IF EXISTS(SELECT [name] FROM sys.tables WHERE [name] = ‘P_C‘) DROP TABLE P_C CREATE TABLE P_C (ID int, ParentID int) INSERT INTO P_C VALUES (0,NULL) --切忌使用0作為根節點(diǎn)的父節點(diǎn)引用值 --否則會(huì )引起逆向枚舉時(shí)的死循環(huán)而導致超出CTE的自嵌套層數限制 INSERT INTO P_C VALUES (1,0) INSERT INTO P_C VALUES (2,0) INSERT INTO P_C VALUES (3,1) INSERT INTO P_C VALUES (4,2) INSERT INTO P_C VALUES (5,3) INSERT INTO P_C VALUES (6,0) INSERT INTO P_C VALUES (7,4) INSERT INTO P_C VALUES (8,5) INSERT INTO P_C VALUES (9,8) INSERT INTO P_C VALUES (10,4) INSERT INTO P_C VALUES (11,10) INSERT INTO P_C VALUES (12,2) INSERT INTO P_C VALUES (13,3) INSERT INTO P_C VALUES (14,6) INSERT INTO P_C VALUES (15,14) INSERT INTO P_C VALUES (16,11) INSERT INTO P_C VALUES (17,14) INSERT INTO P_C VALUES (18,15) INSERT INTO P_C VALUES (19,18) INSERT INTO P_C VALUES (20,7) INSERT INTO P_C VALUES (21,9) INSERT INTO P_C VALUES (22,9) INSERT INTO P_C VALUES (23,12) INSERT INTO P_C VALUES (24,13) INSERT INTO P_C VALUES (25,12) INSERT INTO P_C VALUES (26,15) GO --CTE的實(shí)現代碼,僅檢索節點(diǎn)5的所有子節點(diǎn) WITH PCV(P, C, L) AS ( SELECT P.ID, P.ParentID, 0 FROM P_C AS P WHERE P.ParentID = 5 UNION ALL SELECT C.ID, C.ParentID, L + 1 FROM P_C AS C INNER JOIN PCV ON C.ParentID = PCV.P ) SELECT * FROM PCV GO --利用存儲過(guò)程實(shí)現任意節點(diǎn)子節點(diǎn)的檢索 CREATE PROCEDURE dbo.usp_GetChildrenHierarchy @ParentID int AS WITH PCV(P, C, L) AS ( SELECT P.ID, P.ParentID, 0 --初始的層次計數 FROM P_C AS P WHERE P.ParentID = @ParentID UNION ALL SELECT C.ID, C.ParentID, L + 1 FROM P_C AS C INNER JOIN PCV ON C.ParentID = PCV.P ) SELECT * FROM PCV GO EXEC dbo.usp_GetChildrenHierarchy 3 EXEC dbo.usp_GetChildrenHierarchy 5 EXEC dbo.usp_GetChildrenHierarchy 8 EXEC dbo.usp_GetChildrenHierarchy 9 --利用存儲過(guò)程實(shí)現任意節點(diǎn)父節點(diǎn)的檢索 CREATE PROCEDURE dbo.usp_GetParentHierarchy @ChildrenID int AS WITH PCV(C, P, L) AS ( SELECT P.ID, P.ParentID, 0 --初始的層次計數 FROM P_C AS P WHERE P.ID = @ChildrenID UNION ALL SELECT C.ID, C.ParentID, L - 1 FROM P_C AS C INNER JOIN PCV ON C.ID = PCV.P ) SELECT * FROM PCV GO EXEC dbo.usp_GetParentHierarchy 3 EXEC dbo.usp_GetParentHierarchy 5 EXEC dbo.usp_GetParentHierarchy 8 EXEC dbo.usp_GetParentHierarchy 9 --清理數據庫 DROP PROCEDURE dbo.usp_GetChildrenHierarchy DROP PROCEDURE dbo.usp_GetParentHierarchy DROP TABLE P_C |