我正在解决此线程: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
但是,该查询对于ID列表不是很有用。因此,对于列表,我正在上面链接的线程中尝试答案:
SELECT
child.*
FROM
@Ph as parent
INNER JOIN @Ph as child on child.ProductHierarchyNode.IsDescendantOf(parent.ProductHierarchyNode) = 1
WHERE
parent.ProductHierarchyId in (4)
我确定我忽略了一些显而易见的事情。只是不确定是什么。但这只会返回父项,没有子项。
无法发现我的错误。
答案 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的所有祖先”,将是另一个查询。