鉴于我具有这个结果集结构(多余的字段已被剥离)
Id | ParentId | Name | Depth ----------------------------
是否可以按树顺序返回记录,即Parentthen Children,如果aChild是a Parent,那么它们的记录Children,如果不是thenSibling等等?例如,
Parent
Children
Child
Sibling
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 */
我能想到的唯一方法就是关注本文-
使用嵌套集提高层次结构性能
并针对每条记录包含[LeftExtent]和[RightExtent]字段。现在,本文中的SQL在Ids唯一的情况下可以很好地工作,但是在这种特定的树结构中,具有相同记录的记录Id可以出现在树中的不同位置(ParentId字段显然不同)。我认为问题出在这篇文章的SQL中-
[LeftExtent]
[RightExtent]
Ids
Id
ParentId
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