当前位置: 首页 > 面试题库 >

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

钱黎明
2023-03-14
问题内容

我正在处理此线程: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的所有祖先”,则将是另一个查询。



 类似资料:
  • 问题内容: 使用MySQL,我想从具有此类字段结构的表中返回父母列表。ID,PARENTID,NAME(标准的父子层次结构)。我想遍历树以返回所有“父母”的列表。 我意识到“嵌套集”可能是处理此问题的更好方法-但目前我无法更改数据的结构。我将来会希望这样做。当前-我的数据集实际上将包含一些深度级别- 没什么疯狂的……也许2-5,所以我的递归命中不应太“昂贵”。 我已经看过SQL Server获取父

  • 问题内容: 获取Oracle中所有表的列表? 问题答案: 假设您有权访问DBA_TABLES数据字典视图。如果您没有这些特权但需要它们,则可以请求DBA显式授予您对该表的特权,或者请求DBA授予您该SELECT ANY DICTIONARY特权或SELECT_CATALOG_ROLE角色(这两者都将允许您查询任何数据字典表) )。当然,您可能希望排除某些模式,例如SYS和模式,SYSTEM而这些模

  • 问题内容: 如何获得Python类的父类? 问题答案: 使用以下属性: 从文档: 类对象的基类的元组。 例: 另一个例子:

  • 我试图显示以用户输入的字母开始的单词列表。 因此,例如,如果我在我的列表中添加了三个词,cat、玉米和dog,并且用户输入了字母c,那么Java小程序上的输出应该是cat、玉米。 但是,我不知道该怎么做。 正在将所有用户输入添加到秘密存储的列表中,我现在想在按下时制作另一个按钮,以显示用户以指定字母开头的单词。

  • 我有一个FutureBuilder(很高兴加载)从Firebase获取我的DocumentSnapshot列表,但问题是如果我推送/弹出屏幕,它会一遍又一遍地重建它。为了解决这个问题,我最终将它放在了上,但我有一个问题,我有时无法从中获取所有文档。 我有一个按钮可以启用国家/地区筛选和禁用,每次按下它几乎都会立即显示我的文档,例如,我总共筛选了11个国家/地区,筛选了5个国家/地区,但有时我不会全

  • 我有一个springframework启动应用程序,在这个应用程序上我有很多定时cron,现在我正在创建一个rest控制器(GET),我想在其中获取项目上所有定时cron的列表(元数据) 调度pplication.java 1班。JAVA 2班。JAVA 应用yml 这是我的Rest控制器