【发布时间】:2014-09-17 12:50:07
【问题描述】:
假设我有一个树状结构的区域表:
id parent_id name
---------------------------------
1 null Europe
2 1 Germany
3 2 Köln
4 2 Berlin
5 1 Norway
现在我想管理树中任何节点的访问权限。访问权限与文档和用户有关。我想我可以使用递归 CTE 来获取给定节点处或下方的所有节点。例如,可以访问“德国”的用户应该可以访问与“德国”、“科隆”或“柏林”共享的所有文档,这很简单。
但是,当我想双向遍历树时,我迷路了。德国的用户还应该看到与“欧洲”共享的文档。 Köln 的用户应该能够看到“Köln”、“Germany”和“Europe”,但不能看到“Berlin”。
WITH RegionTree AS (
SELECT topRegion.Id RootId, topRegion.Name, topRegion.Id
FROM Region topRegion
UNION ALL
SELECT rt.RootId, r.Name, r.Id
FROM Region r
INNER JOIN RegionTree rt ON rt.Id = r.ParentId
)
SELECT rt.RootId, rt.Name, rt.Id
FROM RegionTree rt
WHERE rt.RootId = 2
这个查询产生“Germany”、“Köln”、“Berlin”,从节点“Germany”开始上升,但我想运行一个查询,产生所有这些节点,加上任意数量的上升节点,但不是从“德国”分支出来。
我需要创建两个 CTE 并同时查询吗?
【问题讨论】:
标签: sql sql-server tree common-table-expression