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

问题描述 投票:0回答:1

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

例如,当我将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
oracle oracle11g
1个回答
0
投票

您不能排除用于构建层次结构的'文件夹'类型。这样做将终止层次结构,因为将没有优先级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';   
© www.soinside.com 2019 - 2024. All rights reserved.