SQL 2008 HierarchyID - выберите X потомков вниз - PullRequest
2 голосов
/ 05 мая 2010

Как я могу запросить таблицу, в которой есть столбец с типом данных 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
)

Ответы [ 2 ]

3 голосов
/ 28 июля 2010

Я хотел бы добавить немного к вышесказанному. Помимо выбора ветки дерева, вам часто нужны потомки только определенной глубины. Для этого многие таблицы используют дополнительный вычисляемый столбец для «глубины» (что-то вроде [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)

Обратите внимание, что вы можете проиндексировать вычисляемый столбец (возможно, в сочетании или с некоторыми другими столбцами), если вы в большой степени полагаетесь на него.

0 голосов
/ 05 мая 2010
...