我使用嵌套集(aka修改的预定义树遍历)来存储组的列表,我试图找到一种快速方法来生成面包屑(作为字符串,而不是表)为所有的群体一次。我的数据也使用邻接列表模型进行存储(有触发器使两者保持同步)。查找嵌套集的面包屑
因此,例如:
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))
它会工作。
我有一个现有的标量函数可以做到这一点,但它只是没有在组(需要>经10秒钟2000组)的任何合理数量的工作。它将一个groupid和userid作为参数,并返回一个nvarchar。它查找给定的组父母(1个查询获取左/右值,另一个查找父母),将列表限制为用户有权访问的组(使用与上述相同的WHERE子句,以及另一个查询),然后使用游标遍历每个组并将其附加到一个字符串,然后才能最终返回该值。
我需要一种快速运行的方法(例如,< = 1s)。
这是在SQL Server 2005上。
这只适用于特定节点(currentid),并返回一个表,而不是一个字符串。此外,它应该是<= and > =包含的节点,ORDER BY留下来把他们在等级秩序。例如:对于 “节点F”,ID 5,它会返回: 0节点A 3节点d 4节点F 那部分,我知道该怎么做。我想将“节点A>节点D>节点F”作为字段返回,并在一个大查询中为每个组执行此操作。 – gregmac 2009-04-30 22:40:06
嗯SQL服务器的技能不走那么远,我可能会处理这件事我的数据库之外。 – Evert 2009-04-30 23:07:13