gpt4 book ai didi

sql - SQL Server 2008 R2 中父/子类型记录的完整路径转储列表

转载 作者:行者123 更新时间:2023-12-02 06:19:23 26 4
gpt4 key购买 nike

我需要检索存储在数据库中的组(文件夹)的完整路径列表:

select * from groups;

group_id parent_group_id name
-------- --------------- -------------------------------
1 NULL Root
2 1 Folder1
3 2 Folder2
4 3 Folder3

组的可能深度没有限制(几乎可以无限嵌套),所以我事先不知道我可以有多少层。

我希望能够从查询中获得以下结果并将其加载到一个表中,我可以使用该表在其他查询中将完整路径与 group_ids 连接起来:

group_id   path
-------- --------------------------------------------
1 /Root
2 /Root/Folder1
3 /Root/Folder1/Folder2
4 /Root/Folder1/Folder2/Folder3

我一直在查看其他一些具有类似需求的示例,但它似乎从来没有完全符合我的要求,而且没有明确的示例,我很难独自完成。

我唯一能想到的就是将同一张表的别名连接到最大级别数,这可能很多,但这是不切实际的。我需要一种方法以某种方式为每个组递归循环并沿着树向上移动,将路径附加到变量直到我到达末尾,然后将最深的子 ID 及其完整路径存储在表中。

性能也非常重要。这是一个生产数据库,我不能承受减速,这就是为什么我只想在需要时转储它,然后重用静态数据。最终我想转储数千条记录,每条记录都链接到一个 group_id 并打印它们的完整路径。

在不免费提供全部内容的情况下,有人可以指出正确的方向并给我一个通用示例以供复制吗?

我们使用的是 SQL Server 2008 R2。

最佳答案

听起来像是使用递归 CTE 可能能够解决的问题。 CTE(或公用表表达式)允许您创建类似表的结构,而无需创建表或 View 。 CTE 还允许您创建递归查询,这对您的情况有很大帮助。该结构允许您将 CTE 加入自身,从而产生您打算在此处实现的“级联”类型的结果。

例如,您可以这样做:

WITH grouppaths (group_id, group_path) AS
(
SELECT group_id, pathname
FROM GroupPath
WHERE parent_group_id IS NULL

UNION ALL

SELECT gp.group_id, gps.group_path + '/' + gp.pathname
FROM GroupPath gp
JOIN grouppaths gps ON gps.group_id = gp.parent_group_id
)

SELECT
group_id, group_path
FROM
grouppaths

你可以看看这个here使用 SqlFiddle。

Microsoft 在此处提供有关使用 CTE 的信息和示例:http://msdn.microsoft.com/en-us/library/ms190766%28v=sql.105%29.aspx

更具体地说,此链接提供了有关递归 CTE 的更多信息:http://msdn.microsoft.com/en-us/library/ms186243%28v=sql.105%29.aspx

关于sql - SQL Server 2008 R2 中父/子类型记录的完整路径转储列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15282938/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com