【问题标题】:HierarchyID: Get all descendants for a list of parents — Not WorkingHierarchyID:获取父母列表的所有后代 - 不工作
【发布时间】:2019-07-12 19:35:05
【问题描述】:

我正在处理这个帖子:HierarchyID: HierarchyID: Get all descendants for a list of parents

我有一个使用 HierarchyID 的表,我需要一个查询,它可以在一个集合中为我提供指定父级的所有后代。

这是我的表格,已填充:

DECLARE @Ph TABLE (ProductHierarchyNode HIERARCHYID, ProductHierarchyId INT)
INSERT INTO @Ph (ProductHierarchyNode, ProductHierarchyId) VALUES 
(hierarchyid::Parse('/1/'), 1),
(hierarchyid::Parse('/1/1/'), 2),
(hierarchyid::Parse('/1/1/2/'), 3),
(hierarchyid::Parse('/1/1/2/1/'), 4)

此查询非常适用于 SINGLE id:4。它返回了该项目以及它的所有后代。

SELECT
    *
FROM 
    @Ph
WHERE 
    (SELECT ProductHierarchyNode FROM @Ph WHERE ProductHierarchyId = 4).IsDescendantOf(ProductHierarchyNode) = 1 

但是,该查询对于 ID 列表并不是很有用。因此,对于一个列表,我正在尝试上面链接到的线程中的答案:

SELECT 
    child.*
FROM 
    @Ph as parent
    INNER JOIN @Ph as child on child.ProductHierarchyNode.IsDescendantOf(parent.ProductHierarchyNode) = 1
WHERE 
    parent.ProductHierarchyId in (4)

我确定我忽略了一些明显的东西。只是不确定它是什么。但这只会返回父项,没有子项。

无法发现我的错误。

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    我觉得你有这个倒退......你想要 DESCENDENTS,但你要求父母是 4 的东西......没有父母是 4。

    你真的不想要这个吗?

    SELECT 
        child.*
    FROM 
        @Ph as parent
        INNER JOIN @Ph as child on child.ProductHierarchyNode.IsDescendantOf(parent.ProductHierarchyNode) = 1
    WHERE 
        parent.ProductHierarchyId in (1)
    

    这将返回您所说的所有行,并且对我来说更有意义,因为您要求 1 的所有后代(根父级)。 2 是 1 的子/后裔,3 是 2 的子/后裔,4 是 3 的子/后裔。

    “WHERE parent.ProductHierarchyId IN (1)”的意思是“找到 1 为父/祖先的所有节点”。

    在第一个查询中,您要查询所有以 4 为后代的节点,所以这是有道理的。

    在第二个查询中,您要查询 1 的所有后代。如果您想要“4 的所有祖先”,那将是一个不同的查询。

    【讨论】:

    • 我认为你是对的。我想我需要询问 4 的祖先。
    猜你喜欢
    • 2014-09-24
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    相关资源
    最近更新 更多