忽略分层查询中的单个子项(竹子部分)

炸弹轰炸机

我有一个包含分层数据的表,如下所示。

create table tst as 
select 1 id, null parent_id from dual union all
select 2 id, 1 parent_id from dual union all
select 3 id, 1 parent_id from dual union all
select 4 id, 2 parent_id from dual union all
select 5 id, 3 parent_id from dual union all
select 6 id, 5 parent_id from dual union all
select 7 id, 6 parent_id from dual union all
select 8 id, 6 parent_id from dual;

使用该CONNECT BY语句遍历层次结构是微不足道的

我要提取的要求是忽略树的简单(类似于竹子的部分),即,如果父代只有一个孩子,则将两个子代都连接在一起,并将ID串联在一起(此规则是递归应用的)。

所以预期的结果是

       ID  PARENT_ID
---------- ----------
         1            
         2,4        1 
         3,5,6      1 
         7          3,5,6 
         8          3,5,6 

UPDATE或者这也是正确的答案(添加串联的节点列表并重新使用原始IDS)

        ID  PARENT_ID NODE_LST 
---------- ---------- ---------
         1            1       
         4          1 2,4     
         6          1 3,5,6   
         7          6 7       
         8          6 8

到目前为止,我设法计算了孩子的数量,并建立了到孩子计数和ID的根的完整路径...

with child_cnt as (
-- child count per parent
select parent_id, count(*) cnt 
from tst
where parent_id is not NULL
group by parent_id),
tst2 as (
select 
  ID,  child_cnt.cnt,
  tst.parent_id
from tst left outer join child_cnt on tst.parent_id = child_cnt.parent_id),
tst3 as (
SELECT id, parent_id,
  sys_connect_by_path(cnt,',') child_cnt_path,
  sys_connect_by_path(id,',') path
FROM tst2
  START WITH parent_id IS NULL
  CONNECT BY  parent_id  = PRIOR id
)
select * from tst3
;


        ID  PARENT_ID CHILD_CNT_PATH PATH       
---------- ---------- -------------- ------------
         1            ,              ,1           
         2          1 ,,2            ,1,2         
         4          2 ,,2,1          ,1,2,4       
         3          1 ,,2            ,1,3         
         5          3 ,,2,1          ,1,3,5       
         6          5 ,,2,1,1        ,1,3,5,6     
         7          6 ,,2,1,1,2      ,1,3,5,6,7   
         8          6 ,,2,1,1,2      ,1,3,5,6,8   

这表明在ID 4和ID 5上将跳过一级(一个尾随的子计数1),在ID 6上将跳过2级别(在计数路径中两个训练)。

但是我认为应该有一个更简单的方法来解决这个问题。

数学家

这不是很优雅,但是应该可以。如果能找到更好的方法来做最后一部分,我将进行编辑。祝你好运!

with
     d ( id, parent_id, degree ) as (
       select id, parent_id, count(parent_id) over (partition by parent_id)
       from   tst
     ),
     x ( old_id, new_id ) as (
       select id, ltrim(sys_connect_by_path(id, ','), ',')
       from   d
       where connect_by_isleaf = 1
       start with degree != 1
       connect by parent_id = prior id
       and        degree = 1
     )
select x1.new_id as id, x2.new_id as parent_id
from   x x1 
            inner join tst 
                 on tst.id        = regexp_substr(x1.new_id, '^[^,]+')
            left outer join x x2
                 on tst.parent_id = x2.old_id
;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

忽略分层查询中的单个子项(竹子部分)

来自分类Dev

单个子查询在Oracle中返回多行

来自分类Dev

正则表达式匹配整个URL子部分,而不是特定的整个子部分

来自分类Dev

SQLAlchemy-按子项查询父项,过滤联接以匹配列表中的每个子项

来自分类Dev

带父子项的分层SQL查询

来自分类Dev

CSS:在父悬停时更改子项(仅单个子项)

来自分类Dev

在 linq 查询中忽略 DateTime 的时间部分

来自分类Dev

Laravel 4中的子模板(或子部分)

来自分类Dev

在golang中解析JSON的子部分

来自分类Dev

MySQL中的分层查询

来自分类Dev

在单个查询中分层检索记录

来自分类Dev

在单个查询中分层检索记录

来自分类Dev

子部分中的文本将父部分下推

来自分类Dev

子部分中的文本将父部分下推

来自分类Dev

在多项目设置中,Gradle会评估每个子项目。我可以忽略一些子项目吗?

来自分类Dev

从 LINQ 的子集合中选择单个子项

来自分类Dev

如何在一个表中的单个查询上执行多个子查询?

来自分类Dev

具有多个子元素的SQL查询分层XML

来自分类Dev

具有多个子元素的SQL查询分层XML

来自分类Dev

MySQL II中的分层查询

来自分类Dev

Postgres中的分层父查询

来自分类Dev

BigQuery中的递归/分层查询

来自分类Dev

MySQL II中的分层查询

来自分类Dev

如何忽略查询中的部分结果但不是全部

来自分类Dev

Snakemake,RNA-seq:如何根据所分析样品的特征执行管线的一个子部分或另一子部分?

来自分类Dev

Magento忽略分层导航中的子属性

来自分类Dev

UISearchBar 不适用于数组中的子部分

来自分类Dev

离子部分滑动

来自分类Dev

MongoDB在数组中设置一个子项

Related 相关文章

热门标签

归档