在TSQL中,如何选择层次结构中的节点?

时间:2019-04-30 14:11:45

标签: tsql tree common-table-expression

我有一个代表组织层次结构的表。简化一下(因为这里的复杂性不相关),想象一下经典的物料清单或管理层次结构,每个记录都有一个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为整个数据库构建一棵树,否则我认为这将成为性能杀手。

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

0 个答案:

没有答案