3

私がこの結果セット構造を持っていることを考えると(余分なフィールドは取り除かれています)

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

Parentレコードをツリー順に返すことは可能ですChildrenか? 例えば、ChildParentChildrenSibling

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]各レコードに対してフィールドを含めます。この記事の SQLIdsは一意の場合は正常に機能しますが、この特定のツリー構造では、同じレコードが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] の値を指定できるようにするには、どうすればこれを変更できますか? または、必要な順序で結果セットを返す簡単な方法が完全にありませんか?

4

3 に答える 3

7

これが私のためにトリックを行うものです:

@ParentID は階層の開始点にすぎませんが、0 を渡すことができます (ただし、ベース ID として null を使用していると思うので、アイデアが得られます)

順序付けられた並べ替えの鍵は、構築された並べ替えキーにあります。

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
于 2009-07-14T11:44:06.347 に答える
3

SQL Server 2005 の再帰共通テーブル式を確認する必要があります。

あなたの場合、これは次のようになります。

WITH EmployeeCTE AS
(
   -- get the anchor
   SELECT ID, ParentID, Name, 0 as 'Depth'
   FROM Employee WHERE ParentID IS NULL

   -- recursively union lower levels
   UNION ALL
   SELECT e.ID, e.ParentID, e.Name, e.Depth+1
   FROM Employee e
   INNER JOIN EmployeeCTE ON e.ParentID = EmployeeCTE.ID
)
SELECT * FROM EmployeeCTE

これにより、探しているデータを含む適切なクエリ結果セットが得られるはずです。または、何か不足していますか?

マルク

于 2009-07-14T11:10:28.287 に答える
0

具体化されたパスまたはHIERARCHYIDを使用した場合、人生はずっと楽になります...

于 2009-07-14T13:57:53.943 に答える