【问题标题】:Find value contained in the HierarchyId at any level查找任何级别的 HierarchyId 中包含的值
【发布时间】:2021-08-01 22:42:20
【问题描述】:

我需要找到 SQL Server HierarchyId 列中包含的特定值。该值可以出现在任何级别。下面是一个示例代码来说明这个问题:

CREATE TABLE mytable
(
    Id INT NOT NULL PRIMARY KEY,
    TeamName VARCHAR(20) NOT NULL, 
    MyHierarchyId HIERARCHYID NOT NULL
);

INSERT INTO mytable(Id, TeamName, MyHierarchyId) 
VALUES (1, 'Corporate','/1/');

INSERT INTO mytable(Id, TeamName, MyHierarchyId) 
VALUES (2, 'Group A','/1/2/');

INSERT INTO mytable(Id, TeamName, MyHierarchyId) 
VALUES (3, 'Team X','/1/2/3/');

INSERT INTO mytable(Id, TeamName, MyHierarchyId) 
VALUES (4, 'Group B','/1/4/');

INSERT INTO mytable(Id, TeamName, MyHierarchyId) 
VALUES (5, 'Team Y','/1/4/5/');

INSERT INTO mytable(Id, TeamName, MyHierarchyId) 
VALUES (6, 'Team Z','/1/4/6/');

现在我想找到与 Id = 4 相关联的所有记录。这意味着记录 4、5 和 6。我可以使用这样的蛮力方法:

SELECT [M].[Id],
       [M].[TeamName],
       [M].[MyHierarchyId],
       [M].[MyHierarchyId].ToString() AS Lineage
FROM [dbo].[mytable] AS [M]
WHERE [M].[MyHierarchyId].ToString() LIKE '%4%'

但我怀疑这会非常低效。再一次,问题是我正在搜索的节点的级别是事先不知道的。

感谢您的任何建议。

【问题讨论】:

    标签: sql sql-server tsql hierarchyid


    【解决方案1】:

    您可以使用IsDescendantOf()

    Select * 
     from mytable
     Where MyHierarchyID.IsDescendantOf( (select MyHierarchyID from mytable where id=4)  ) = 1
    

    结果

    Id  TeamName    MyHierarchyId
    4   Group B     0x5C20
    5   Team Y      0x5C3180
    6   Team Z      0x5C3280
    

    【讨论】:

    • 请注意,分层数据类型是可索引的,因此如果您的表有很多行,您可以为列添加索引以加快上述查询。
    猜你喜欢
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多