sql - 寻找嵌套集的面包屑

标签 sql sql-server-2005 breadcrumbs nested-sets mptt

我正在使用嵌套集(又名修改后的前序树遍历)来存储组列表,并且我正在尝试找到一种快速方法来为所有组生成面包屑(作为字符串,而不是表格)立刻。我的数据也使用邻接列表模型存储(有触发器使两者保持同步)。

例如:

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

我希望能够有一个返回表的用户定义函数:

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 上。

最佳答案

下面的 SQL 帮助我从树中的任意点获取“面包屑”路径。希望对您有所帮助。

SELECT ancestor.id, ancestor.title, ancestor.alias 
FROM `categories` child, `categories` ancestor 
WHERE child.lft >= ancestor.lft AND child.lft <= ancestor.rgt 
AND child.id = MY_CURRENT_ID 
ORDER BY ancestor.lft

凯丝

关于sql - 寻找嵌套集的面包屑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/809124/

相关文章:

sql - UNION 与 CROSS APPLY 性能

mysql - 如何从表中每条记录的日期/时间字段中减去 2 小时?

mysql - 你如何用sql语句计算树的深度?

sql - 如何在批处理文件中将局部变量设置为sql查询的结果?

symfony - 奏鸣曲管理员 : replace ID in breadcrumbs

javascript - 为面包屑菜单定义变量?

sql - 处理所有子项时更新父项记录

SQL Server 2005 总和

sql-server - 在 SQL Server 代理服务帐户选项下运行在快照代理中被禁用