HierarchyID:获取所有后代以获得父母列表-不工作

时间:2019-07-12 19:35:05

标签: sql sql-server tsql

我正在解决此线程: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)

此查询非常适合单个ID:4。它将给我该项及其所有后代。

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

enter image description here

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

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

我确定我忽略了一些显而易见的事情。只是不确定是什么。但这只会返回父项,没有子项。

enter image description here

无法发现我的错误。

1 个答案:

答案 0 :(得分:1)

我觉得您倒退了……您想要后裔,但您要问的是父级为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的所有祖先”,将是另一个查询。