sql - 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
如果它有子级)
解决方案
我认为您需要以相反的方式遍历树,然后可以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
改为,或者其他一些条件,具体取决于您实际想要查看的数据。
您还可以使用考虑递归子查询分解。
推荐阅读
- windows - 如何每天自动备份postgresql数据库?
- symmetricds - SymmetricDS:清洁暂存区
- mysql - 查询为每个经理计算员工人数(经理也为零计数)
- php - 重复键更新错误
- android - 所有支持库相同的版本
- python-3.x - 为什么分配给集群的数据会随着集群的数量而减少?
- javascript - onclick 聚焦使用 javascript 创建 js 文本框
- java - Graal 不支持垃圾收集器
- swift - 子对象的 Swift JSONEncoder().encode
- intellij-idea - 在intellij模板中区分int和double