首页 > 解决方案 > 在 TSQL 中,如何选择层次结构中的节点?

问题描述

我有一个代表组织层次结构的表。稍微简化一下(因为这里不涉及复杂性),想象一下经典的物料清单或管理层次结构,每条记录都有一个 id 和一个 parent_id,当然还有其他相关数据,我们只说名称。我们称这个表为“节点”。

然后我有记录说明哪些用户有权访问层次结构中任何给定节点的数据。调用这个 node_user。

因此,我想查找位于或低于给定节点的节点的所有 node_user 记录。

对于少数有限数量的级别来说足够简单。说 ...

select nu.userid
from node_user nu
join node n1 on n1.id=nu.node_id
left join node n2 on n2.id=n1.parent_id
left join node n3 on n3.id=n2.parent_id
where @root in (n1.id, n2.id, n3.id)

但是如果我不知道最大深度或者它很大怎么办?我在想我可以使用 CTE 来“追上树”,做“从 node_user 加入(带有层次结构......)”,但这是一个语法错误。显然您不能将 CTE 用作子查询。但是我不能将 CTE 作为主要查询,因为我不知道我会找到哪些节点。除非我让 CTE 为整个数据库构建一棵树,否则我认为这会成为性能杀手。

有没有简单的方法可以做到这一点,而我只是大脑冻结?

标签: tsqltreecommon-table-expression

解决方案


推荐阅读