【问题标题】:Query for Parent Child Relationship to the top level查询到顶层的父子关系
【发布时间】:2013-05-27 20:09:57
【问题描述】:
NodeId NodeName ParentId 权限 ----------------------------------------------------------- 1 节点 1 0 1 2 节点 2 1 空 3 节点 3 1 空 4 节点 4 1 空 5 节点 5 2 空 6 节点 6 5 空 7 节点 7 2 空

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

【问题讨论】:

  • 你真的需要递归。你用的是什么数据库?您的层次结构是否有最大深度?
  • @gbn,SQL Server 2008
  • @MartinWilson,层次结构没有最大深度。
  • 您是否尝试过使用递归 CTE? msdn.microsoft.com/en-us/library/ms186243(v=sql.105).aspx
  • 当权限不为NULL时,这是层次的顶部吗?还是 ParentID = 0?

标签: sql sql-server-2008


【解决方案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');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多