我正在处理此线程: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)
我确定我忽略了一些显而易见的事情。只是不确定是什么。但这只返回父项,没有子项。
无法发现我的错误。
我觉得您有这个倒退…您想要后代,但您正在要求父母为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的所有祖先”,则将是另一个查询。