我需要使用HierarchyID
SQL Server
找到所有类别的后代。
我知道如何找到直接的孩子,但我想找到孩子的孩子等等。
有没有办法使用HierarchyID
?
答案 0 :(得分:25)
如果您拥有所需树的根,则不能只使用:
DECLARE @root hierarchyID;
SELECT @root = col
FROM yourTable
WHERE [whatever uniquely identifies this row]
SELECT *
FROM yourTable
WHERE col.IsDescendantOf(@root) = 1
答案 1 :(得分:16)
我假设我的例子中你的表格如下:
DECLARE TABLE MyTable
(
HID hierarchyid PRIMARY KEY,
ID int IDENTITY(1, 1),
SomeText varchar(50)
);
如果你想要一个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);
答案 2 :(得分:0)
我是这类查询的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