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

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


是否可以按树顺序返回记录,即Parent然后是Children,如果ChildParent,则是它们的Children,如果不是,则是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 */


我想到的唯一方法就是关注本文-

Improve hierarchy performance using nested sets

并在每条记录中包含[LeftExtent][RightExtent]字段。现在,当Ids是唯一的时,本文中的SQL可以正常工作,但是在这种特定的树结构中,具有相同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

09-10 03:52
查看更多