查询父级子关系到顶级

时间:2013-05-27 10:41:16

标签: sql sql-server-2008

NodeId    NodeName    ParentId   Permission
-----------------------------------------------
1         Node1       0          1
2         Node2       1          NULL
3         Node3       1          NULL
4         Node4       1          NULL
5         Node5       2          NULL
6         Node6       5          NULL
7         Node7       2          NULL

我在Node6中,我需要在树中获得第一个非NULL权限(6-> 5-> 2-> 1-> Permission = 1) 我该怎么办?

1 个答案:

答案 0 :(得分:1)

由于Permission is NOT NULL必须位于层次结构中,因此该行成为此案例的根节点。我在这里标记了RootID

还添加了更多样本数据,以显示来自同一ParentID = 0

的多个分支
DECLARE @t TABLE (NodeId int, NodeName varchar(100), ParentId int, Permission int)
INSERT @t VALUES 
(1,'Node1',0,NULL),
(2,'Node2',1,1),
(3,'Node3',1,NULL),
(4,'Node4',1,NULL),
(5,'Node5',2,NULL),
(6,'Node6',5,NULL),
(7,'Node7',2,NULL),
(8,'Node1',0,NULL),
(9,'Node9',8,2),
(10,'Node10',9,NULL),
(11,'Node11',10,NULL),
(12,'Node12',11,NULL),
(13,'Node13',10,NULL),
(14,'Node14',9,NULL);

WITH CTE AS
(
    SELECT NodeId, NodeName, ParentId AS RootID FROM @t WHERE Permission IS NOT NULL
    UNION ALL
    SELECT T.NodeId, T.NodeName, CTE.RootID
    FROM @t T JOIN CTE ON T.ParentId = CTE.NodeId
)
SELECT
    *
FROM
    CTE
WHERE
    NodeName IN ('Node6', 'Node13');