2

データ型 HIERARCHYID の列を持つテーブルをクエリして、従業員の X レベル下にある子孫のリストを取得するにはどうすればよいですか?

現在の構造は次のとおりです。

CREATE TABLE [dbo].[Employees](
    [NodeId] [hierarchyid] NOT NULL,
    [EmployeeId] [int] IDENTITY(1,1) NOT NULL,
    [FirstName] [varchar](120) NULL,
    [MiddleInitial] [varchar](1) NULL,
    [LastName] [varchar](120) NULL,
    [DepartmentId] [int] NULL,
    [Title] [varchar](120) NULL,
    [PhoneNumber] [varchar](20) NULL,
    [IM] [varchar](120) NULL,
    [Photo] [varbinary](max) NULL,
    [Bio] [varchar](400) NULL,
    [Active] [bit] NULL,
    [ManagerId] [int] NULL
)
4

1 に答える 1

3

上記に少し付け加えたいと思います。木の枝を選択することに加えて、特定の深さだけの子孫が必要になることがよくあります。これを実現するために、を使用する多くのテーブルは、「深さ」(のような)の計算列を追加します[Depth] AS (myHierarchy.GetLevel]()。この追加の列を使用すると、次のようなクエリを実行して深さで制限できます。

SELECT @MaxDepth       = 3,

SELECT @theParent      = Hierarchy,
       @theParentDepth = Depth
FROM   myTreeTable T 
WHERE  T.RowID         = @RowID

SELECT    myHierarchy
FROM      myTreeTable T
WHERE     T.myHierarchy.IsDescendantOf(@theParent) = 1  AND
          T.Depth < (@theParentDepth  + @MaxDepth)

計算列に大きく依存している場合は、計算列にインデックスを付けることができます(おそらく他の列と組み合わせたり、他の列を含めたりする場合があります)。

于 2010-07-28T13:35:43.660 に答える