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顺便说一句.
编辑:
它只是感兴趣的表的绝对最大深度.不是单个节点的深度.
试试这个,它会找到层次结构的所有底层
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)