Как найти ВСЕ потомков, используя HierarchyID для SQL Server
Мне нужно найти всех потомков категории, используя HierarchyID
для SQL Server
.
Я знаю, как найти прямых детей, но я хотел бы найти детей детей детей и так далее.
Есть ли способ сделать это, используя HierarchyID
?
Ответы
Ответ 1
Если у вас есть корень нужного дерева, не можете ли вы просто использовать:
DECLARE @root hierarchyID;
SELECT @root = col
FROM yourTable
WHERE [whatever uniquely identifies this row]
SELECT *
FROM yourTable
WHERE col.IsDescendantOf(@root) = 1
Ответ 2
Я возьму для своего примера, что ваша таблица выглядит примерно так:
DECLARE TABLE MyTable
(
HID hierarchyid PRIMARY KEY,
ID int IDENTITY(1, 1),
SomeText varchar(50)
);
Если вы хотите, чтобы все декодеры node с 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 уровня детей по запрошенному node, вам нужно будет зафиксировать уровень поиска node в первом выборе и изменить сравнение с чем-то вроде
WHERE HID.IsDescendantOf(@searchNode) = 1
AND HID.GetLevel() <= (@searchLevel + 2);
Ответ 3
Я поклонник CTE для такого рода запросов, потому что у вас есть определенная гибкость в том, следует ли возвращать только детей, только родителя или обоих в зависимости от того, как вы структурируете свой код. В этом случае я возвращаю UNION обоих, например.
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