gpt4 book ai didi

SQL Server 树层次结构和具有重复记录 id 的嵌套集

转载 作者:行者123 更新时间:2023-12-04 22:32:17 25 4
gpt4 key购买 nike

鉴于我有这个结果集结构(多余的字段已被剥离)

Id | ParentId | Name | Depth
----------------------------

是否可以按树顺序返回记录,即 Parent然后 Children , 如果一个 ChildParent ,然后他们的Children , 如果没有,那么 Sibling , ETC?例如,

Id | ParentId | Name | Depth
----------------------------
1 NULL Major 1
2 1 Minor 2
3 1 Minor 2
4 3 Build 3
5 3 Build 3
6 1 Minor 2

/* etc, etc */

我能想到的唯一方法就是关注这篇文章 -

Improve hierarchy performance using nested sets

并包括 [LeftExtent][RightExtent]针对每条记录的字段。现在文章中的 SQL 在 Ids 时工作正常。是唯一的,但在这个特定的树结构中,具有相同 Id 的记录可以出现在树中的不同位置(很明显,ParentId 字段不同)。我认为问题出在文章中的这个 SQL 中 -

  INSERT INTO @tmpStack
(
EmployeeID,
LeftExtent
)
SELECT TOP 1 EmployeeID, @counter
FROM Employee
WHERE ISNULL(ParentID, 0) = ISNULL(@parentid,0)
/* If the Id has already been added then record is not given [LeftExtent] or [RightExtent] values. */
AND EmployeeID NOT IN (SELECT EmployeeID FROM @tmpStack)

如何更改它以允许有重复的记录 Ids被赋予 [LeftExtent] 和 [RightExtent] 值,或者我完全错过了一种更简单的方法来按我需要的顺序返回结果集?

最佳答案

这对我有用:

@ParentID 只是层次结构中的一个起点,但你可以传入 0(但我认为你使用 null 作为基本 ID,所以你会明白的)

有序排序的关键在于构建的排序键。

WITH RoleHierarchy (RoleID, [Role], [Description], ParentID, Editable, HierarchyLevel, SortKey) AS
(
-- Base
SELECT
RoleID,
[Role],
[Description],
ParentID,
Editable,
0 as HierarchyLevel,
CAST(RoleID AS VARBINARY(300))
FROM
dbo.Roles
WHERE
RoleID = @ParentID

UNION ALL

-- Recursive
SELECT
e.RoleID,
e.[Role],
e.[Description],
e.ParentID,
e.Editable,
th.HierarchyLevel + 1 AS HierarchyLevel,
CAST (th.SortKey + CAST (e.[Role] AS VARBINARY(100)) + CAST (e.[RoleID] AS VARBINARY(100)) AS VARBINARY(300))
FROM
Roles e
INNER JOIN RoleHierarchy th ON e.ParentID = th.RoleID
WHERE
e.RoleID != 0
)

SELECT
RoleID,
ParentID,
[Role],
[Description],
Editable,
HierarchyLevel
FROM
RoleHierarchy
WHERE
RoleID != @ParentID
ORDER BY
SortKey

关于SQL Server 树层次结构和具有重复记录 id 的嵌套集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1124677/

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