我正在使用嵌套集(又名修改的预排序树遍历)来存储组列表,并且我试图找到一种快速的方法来为所有组生成面包屑(作为字符串,而不是表格)一次。我的数据也使用邻接列表模型存储(有触发器使两者保持同步)。
例如:
ID Name ParentId Left Right
0 Node A 0 1 12
1 Node B 0 2 5
2 Node C 1 3 4
3 Node D 0 6 11
4 Node E 3 7 8
5 Node F 4 9 9
代表树:
- 节点 A
- 节点 B
- 节点 C
- 节点 D
- 节点 E
- 节点 F
- 节点 B
我希望能够有一个返回表的用户定义函数:
ID Breadcrumb
0 Node A
1 Node A > Node B
2 Node A > Node B > Node C
3 Node A > Node D
4 Node A > Node D > Node E
5 Node A > Node D > Node F
为了使这稍微复杂一些(尽管它有点超出了问题的范围),我还有需要遵守的用户限制。例如,如果我只能访问 id=3,当我运行查询时,我应该得到:
ID Breadcrumb
3 Node D
4 Node D > Node E
5 Node D > Node F
我确实有一个用户定义的函数,它以用户 ID 作为参数,并返回一个表,其中包含所有有效组的 ID,只要在查询中的某个位置
WHERE group.id IN (SELECT id FROM dbo.getUserGroups(@userid))
它会起作用的。
我有一个现有的标量函数可以做到这一点,但它不适用于任何合理数量的组(2000 个组需要 >10 秒)。它以 groupid 和 userid 作为参数,并返回一个 nvarchar。它找到给定的组父母(1个查询来获取左/右值,另一个查询来查找父母),将列表限制为用户有权访问的组(使用与上面相同的 WHERE 子句,因此还有另一个查询),然后使用游标遍历每个组并将其附加到字符串,最后返回该值。
我需要一种可以快速运行的方法(例如<= 1s),即时运行。
这是在 SQL Server 2005 上。