如何忽略层次结构查询中特定类型的直接父级

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何忽略层次结构查询中特定类型的直接父级相关的知识,希望对你有一定的参考价值。

我有下面的表定义。由于我需要忽略“包装”类型的直接父级;表中也可以存在其他类型。

例如,当我将CHILD_NODE_ID = 3289374传递给查询时,直接的parent_id是3289375,但是它是'Folder'类型的,因此从层次结构查询本身中将其忽略,并且下一个父类ID 3289376(其类型为Package)也应从结果集按照我的要求。

我只对包类型感兴趣。我的查询也将仅获取包类型,但不会忽略“包”类型的直接父级。

分层查询应仅递归检查包类型,并应产生最终结果为“ 3289373”。

CHILD_NODE          
******************          
ID  PARENT_NODE_ID  CHILD_NODE_ID       ISBN
2314861 3289375     3289374             9780838474648
2314862 3289376     3289375             folder_name
2314863 3289373     3289376             9780838473559
2314864 1271271     3289373             9780838441473



NODE        
***********     
ID      Type    
3289374 Package 
3289375 Folder  
3289376 Package 
3289373 Package 


SELECT *

                    FROM CHILD_NODE c, NODE n 
                         WHERE
                          c.CHILD_NODE_ID=N.ID AND
                           N.TYPE='Package'
                                    START WITH CHILD_NODE_ID=3289374
                                    CONNECT BY PRIOR PARENT_NODE_ID = CHILD_NODE_ID
答案

您不能排除用于构建层次结构的'文件夹'类型。这样做将终止层次结构,因为将没有优先级ID。因此,一种方法是在CTE中构建层次结构,然后从CTE中进行选择来消除Folder。

with hier as 
   ( select c.id, c.parent_node_id, c.child_node_id, n.type, level                                          
       from child_node c                       
       join node       n  on c.child_node_id=n.id                                             
      start with c.child_node_id=3289374               
    connect by prior c.parent_node_id = c.child_node_id
   )
select * from hier where type <> 'Folder';   

以上是关于如何忽略层次结构查询中特定类型的直接父级的主要内容,如果未能解决你的问题,请参考以下文章

获取满足条件的直接父级的 SQL 查询

如何配置 log4j 以忽略层次结构记录器

SQL Server 使用 Hierarchyid 操作层次结构数据

多个类型/类的HQL查询

如何让MySQL中单句实现无限层次父子关系查询

用于更新树层次结构中节点父级的 REST API 设计