一尘不染

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

sql

我正在处理此线程:HierarchyID:HierarchyID:获取所有后代以获得父母列表

我有一个使用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

在此处输入图片说明

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

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

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

在此处输入图片说明

无法发现我的错误。


阅读 141

收藏
2021-05-23

共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的所有祖先”,则将是另一个查询。

2021-05-23