我需要在Oracle 12c中扁平化一个层次结构,简化的输入示例在左侧,底部添加了一个图形表示(下面的屏幕截图)。目标输出在右侧突出显示。
有4个层次,其中Lvl_1是层次结构的顶层,并且有缺失的层次。要求是缺失的层次应使用可用的最低明细层填充。有多个样本,如P_1_2
我不知道如何解决这个问题,我已经找到了几个针对SQL Server而不是Oracle的解决方案,但没有一个解决方案能像此要求那样管理缺少的级别标准
有谁做过这样的事吗?
CREATE TABLE ztest_product
(
PRODUCT_ID VARCHAR(10)
, PARENT_ID VARCHAR(10)
)
;
Insert into ztest_product(PRODUCT_ID, PARENT_ID) values ('P_0', NULL);
Insert into ztest_product(PRODUCT_ID, PARENT_ID) values ('P_1', 'P_0');
Insert into ztest_product(PRODUCT_ID, PARENT_ID) values ('P_1_1', 'P_1');
Insert into ztest_product(PRODUCT_ID, PARENT_ID) values ('P_1_2', 'P_1');
Insert into ztest_product(PRODUCT_ID, PARENT_ID) values ('P_1_1_1', 'P_1_1');
Insert into ztest_product(PRODUCT_ID, PARENT_ID) values ('P_1_1_2', 'P_1_1');
Insert into ztest_product(PRODUCT_ID, PARENT_ID) values ('P_1_1_3', 'P_1');
Insert into ztest_product(PRODUCT_ID, PARENT_ID) values ('P_2_1_1', 'P_0');
Insert into ztest_product(PRODUCT_ID, PARENT_ID) values ('P_3', 'P_0');
Insert into ztest_product(PRODUCT_ID, PARENT_ID) values ('P_3_1_1', 'P_3');
Insert into ztest_product(PRODUCT_ID, PARENT_ID) values ('P_3_2', 'P_3');
Insert into ztest_product(PRODUCT_ID, PARENT_ID) values ('P_3_1_2', 'P_3_2');
COMMIT;
3条答案
按热度按时间eanckbw91#
您可以找到层次结构的叶节点,并使用
SYS_CONNECT_BY_PATH
找到所采用的路径,然后将其拆分为不同的级别:对于您的示例数据,它将输出:
| 第1级|第二级|三级|四级|
| - -|- -|- -|- -|
| 第0页|第一页|第1页第1页|第1页第1页|
| 第0页|第一页|第1页第1页|第1_1_2页|
| 第0页|第一页|第1_1_3页|第1_1_3页|
| 第0页|第一页|第1页第2页|第1页第2页|
| 第0页|第二页第一页|第二页第一页|第二页第一页|
| 第0页|第三层|第3_1_1页|第3_1_1页|
| 第0页|第三层|P_3_2页|第三页第一页第二页|
fiddle
oewdyzsn2#
下面是一个准备查询,它生成缺少的节点,而不使用regexp_substr,如果数据集很大,regexp_substr可能会导致性能问题:
结果是包含缺失节点的完整树,其中添加的节点是其自身的父节点:
xtupzzrd3#
完整查询给出了预期的表: