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

标签 sql sql-server-2008 tsql

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

INSERT INTO MYTABLE VALUES(NULL, 2)
INSERT INTO MYTABLE VALUES(1, 2)

我现在正在构建一个需要知道层次结构最大深度的过程。假设节点 E 是节点 D 的子节点,而节点 D 是节点 C 的子节点。 节点 C 是顶级节点,也是节点 B 的子节点,节点 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)

关于sql - 查找多父层次结构的深度 - SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7951374/

相关文章:

sql - 在 SQL (PostgreSQL) 中选择动态的几行

sql-server - SQL Server 2008 授予 information_schema.columns 权限

asp.net - 在本地主机上找到存储过程,但发布时找不到

SQL - 从一组记录中选择最大值

SQL:如何在查询中使用 case 和 cast?

mysql - 优化 SQL 以获取行数

MySQL 查询 GROUP BY 日/月/年

sql-server - MS-SQL 中的“START WITH”等效表达式

sql - 仅当传递的参数具有值时才使用 Where 子句中的 'Exists'

sql-server - SQL Server 临时表已经存在?