查找多父层次结构的深度 - SQL

use*_*237 2 sql t-sql sql-server-2008

我有一个包含两列的表:mother - node这个表构成了一个层次结构的基础.母亲指的是一个节点.每个节点可以有多个母亲,每个母亲可以有多个孩子.这是通过多行完成的.如果mother = NULL,则该节点是顶级节点.可以有多个顶级节点,节点既可以是顶级节点,也可以是另一个节点的子节点.例如:

INSERT INTO MYTABLE VALUES(NULL, 2)
INSERT INTO MYTABLE VALUES(1, 2)
Run Code Online (Sandbox Code Playgroud)

我现在正在构建一个需要知道层次结构最大深度的过程.假设节点E是节点D的子节点,节点D是节点C的子节点.节点C是顶级节点,并且节点B的子节点是节点A节点A的子节点,它只是顶级节点.如果我们说节点A的深度= 0.那么在这种情况下,节点E的深度应为4.

有没有人知道如何建立一个能为我找到这个深度的陈述?它必须找到表中每个节点的最大深度,然后返回那些节点的最大值.

谢谢!

使用SQL Server 2008顺便说一句.

编辑:

它只是感兴趣的表的绝对最大深度.不是单个节点的深度.

t-c*_*.dk 8

试试这个,它会找到层次结构的所有底层

declare @mytable table(id int, parent_id int)

INSERT INTO @MYTABLE VALUES(1, NULL) 
INSERT INTO @MYTABLE VALUES(2, 1) 
INSERT INTO @MYTABLE VALUES(3, 1) --*
INSERT INTO @MYTABLE VALUES(4, 2) 
INSERT INTO @MYTABLE VALUES(5, 4) --*

;with a as
(
    select 
       id, 
       parent_id, 
       1 lvl 
    from @mytable 
    where parent_id is null
    union all
    select 
        b.id, 
        b.parent_id, 
        lvl+1 
    from @mytable b 
        join a on a.id = b.parent_id
)
select 
    a.id, 
    a.parent_id, 
    a.lvl 
from a
    left join a b on a.id = b.parent_id
where b.id is null
option (maxrecursion 0)
Run Code Online (Sandbox Code Playgroud)