14

我需要使用HierarchyIDfor找到一个类别的所有后代SQL Server

我知道如何找到直接的孩子,但我想找到孩子的孩子等等。

有没有办法使用HierarchyID?

4

3 回答 3

27

如果你有你想要的树的根,你不能只使用:

DECLARE @root hierarchyID;

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

SELECT *
FROM yourTable
WHERE col.IsDescendantOf(@root) = 1
于 2010-04-17T20:41:16.137 回答
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);
于 2010-10-01T05:34:12.787 回答
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
于 2014-03-25T18:08:36.697 回答