Sql 查询与顶层的父子关系 NodeId NodeName ParentId权限 ----------------------------------------------- 1节点10 1 2节点2 1空 3节点3 1空 4节点4 1空 5节点5 2空 6节点6 5空 7节点7 2空

Sql 查询与顶层的父子关系 NodeId NodeName ParentId权限 ----------------------------------------------- 1节点10 1 2节点2 1空 3节点3 1空 4节点4 1空 5节点5 2空 6节点6 5空 7节点7 2空,sql,sql-server-2008,Sql,Sql Server 2008,我在Node6中,我需要获得树中的第一个非空权限(6->5->2->1->permission=1) 如何执行此操作?因为权限不为空必须在层次结构中,因此此行将成为本例的根节点。我在这里标记了这个RootID 还添加了更多示例数据,以显示来自同一ParentID=0root的多个分支 NodeId NodeName ParentId Permission ----------------------------------------------- 1 Node1

我在Node6中,我需要获得树中的第一个非空权限(6->5->2->1->permission=1)
如何执行此操作?

因为
权限不为空
必须在层次结构中,因此此行将成为本例的根节点。我在这里标记了这个
RootID

还添加了更多示例数据,以显示来自同一
ParentID=0
root的多个分支

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
你真的需要递归。你在使用什么数据库?您的层次结构是否有最大深度?@gbn,SQL Server2008@MartinWilson,层次结构没有最大深度。是否尝试使用递归CTE?当权限不为NULL时,这是层次结构的顶端吗?还是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');