温馨提示:本文翻译自stackoverflow.com,查看原文请点击:sql - CONNECT BY PRIOR and concatenation of parent
database oracle oracle-sqldeveloper sql

sql - 按优先级连接和父级连接

发布于 2020-04-29 08:52:31

我有这张桌子:

img

所需结果:

img

我正在尝试的是:

select SEG from my_table CONNECT BY PRIOR PARENT_SEG_ID = SEG_ID;

因此,在列LEVEL_LOCATOR中,我们可以看到fe级别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如果有子元素)

查看更多

提问者
K_dev
被浏览
30
Alex Poole 2020-02-11 02:19

我认为您需要以另一种方式走到树上,然后可以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改为选择其他条件,具体取决于您实际想要查看的数据。

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