2010-04-17 5 views

ответ

24

Если у вас есть корень дерева вы хотите, вы не можете просто использовать:

DECLARE @root hierarchyID; 

SELECT @root = col 
FROM yourTable 
WHERE [whatever uniquely identifies this row] 

SELECT * 
FROM yourTable 
WHERE col.IsDescendantOf(@root) = 1 
+1

Marc - Как вы можете ограничить потомков до X уровней? – IEnumerator

+0

@IEnumerator - вы можете использовать 'col.GetLevel()' и добавить его в предложение where – BornToCode

16

Я буду считать для моего примера, что ваш стол что-то вроде следующего:

DECLARE TABLE MyTable 
(
    HID hierarchyid PRIMARY KEY, 
    ID int IDENTITY(1, 1), 
    SomeText varchar(50) 
); 

Если вы хотите, чтобы все decendants из узла с ID 3, вплоть до максимального уровня (от корня) 5:

DECLARE @searchNode hierarchyid; 

SELECT @searchNode = HID 
FROM MyTable 
WHERE ID = 3; 

SELECT * 
FROM MyTable 
WHERE HID.IsDescendantOf(@searchNode) 
AND HID.GetLevel() <= 5; 

Если в вместо него вы хотите 2 уровня детей в запрашиваемом узле вам нужно будет захватить уровень вашего поиска узла в первом выбрать и изменить сравнение с чем-то вроде

WHERE HID.IsDescendantOf(@searchNode) = 1 
AND HID.GetLevel() <= (@searchLevel + 2); 
0

Я фанат КТР для такого рода запроса, потому что у вас есть определенная гибкость в том, следует ли возвращать только детей, только родителя или обоих в зависимости от того, как вы структурируете свой код. В этом случае я возвращаю СОЮЗ обоих, например.

declare @MyTable table 
(
    ID int not null, 
    HierId hierarchyid null 
); 

declare @id int 
set @id = 1 

;with parent (TenantId, HierId, IsParent) as 
(
    select 
     t.ID 
     ,t.HierId 
     ,cast(1 as bit) as IsParent 
    from @MyTable t 
    where t.ID = @id 
), children as 
(
    select 
     t.ID 
     ,t.HierId 
     ,cast(0 as bit) as IsParent 
    from 
     @MyTable t 
     inner join parent p 
      on t.HierId.IsDescendantOf(p.HierId) = 1 
) 
select 
    * 
from parent 
UNION 
select * 
from children 

 Смежные вопросы

  • Нет связанных вопросов^_^