首页 > 解决方案 > CONNECT BY PRIOR 和父子层次结构的串联

问题描述

我有这张桌子:

图像

期望的结果:

图像

我正在尝试什么:

select SEG from my_table CONNECT BY PRIOR PARENT_SEG_ID = SEG_ID;

因此,在 LEVEL_LOCATOR 列中,我们可以看到 LEVEL 5.9 有 6 个孩子,而 5.9.4 有 2 个孩子。而且,fe,孩子 5.9.1 的父母是 Postpaid,它的 SEG_ID = 361978,它在这个孩子的行中作为 PARENT_SEG_ID。所以父母和孩子用SEG_ID和PARENT_SEG_ID连接。

我正在尝试这样做,但到目前为止我无法获得我想要的结果。

注意: col_a 是以下格式的连接 SEG 列:(parent - child - child如果它有子级)

标签: sqldatabaseoracleoracle-sqldeveloper

解决方案


我认为您需要以相反的方式遍历树,然后可以sys_connect_by_path()用来连接段名称,并connect_by_isleaf仅显示叶节点:

select col_a, col_b
from (
  select ltrim(sys_connect_by_path(seg, ' - '), ' - ') as col_a,
    seg_id as col_b,
    connect_by_isleaf as isleaf
  from my_table
  start with seg = 'Prepaid'
  connect by parent_seg_id = prior seg_id
)
where isleaf = 1;

COL_A                                                   COL_B
-------------------------------------------------- ----------
Prepaid                                                361977
Prepaid - Voice Mobile                             2687522995
Prepaid - Internet Mobile                          2687525564
Prepaid - Data Mobile                              2687527808
Prepaid - Voice Fixa - Default                     2687531979
Prepaid - Voice Fixa - Internal PABX               2687534794

在那里可以删除路径开始时包含ltrim()的额外内容。-

但是你需要一个起始条件;我已经使用了“预付费”,它在输出中包含了一个额外的行,但您可以start with seg_id = 361978改为,或者其他一些条件,具体取决于您实际想要查看的数据。

您还可以使用考虑递归子查询分解。


推荐阅读