有一个带有业务部门树形结构的表。
BUT_ID PARENT_ID REFERENCE_CODE BUT_PATH
173 10 SBT022 /1/2/10/173
174 8 SEM05000 /1/2/8/174
175 10 SBT023 /1/2/10/175
2 1 O /1/2
8 2 SP /1/2/8
1 null root null
BUT_PATH
是业务树中当前业务部门的路径。
我被困在编写查询以输出BUT_PATH
结构以及相应的参考代码而不是id的问题。例如,对于/1/2/8/174
,就像Oracle 12c中的/O/SP/SEM05000
。
答案 0 :(得分:1)
我们可以通过首先创建一行的副本(与路径中的节点数量一样多)来实现此目的。可以通过使用ROWNUM
伪列将表与其自身连接-在ROWNUM <=
上连接路径中的节点数来实现,我们可以使用REGEXP_COUNT()
来对路径中的节点数进行提取/
。
对于具有 n 个节点的每条路径,我们现在有 n 行,其行号为RN
,从1到 n 。使用REGEXP_REPLACE()
,我们可以从路径中提取第RN
个节点的ID。
我们再次使用该路径中的第RN
个ID来联接表。像这样,我们在相应行中有第RN
个节点的引用。
最后,我们汇总并使用LISTAGG()
将引用路径放在一起。
SELECT T1.BUT_ID,
T1.PARENT_ID,
T1.REFERENCE_CODE,
T1.BUT_PATH,
'/' || LISTAGG(T3.REFERENCE_CODE, '/') WITHIN GROUP (ORDER BY X1.RN) REFERENCE_PATH
FROM ELBAT T1
INNER JOIN (SELECT ROWNUM RN
FROM ELBAT T2) X1
ON X1.RN <= REGEXP_COUNT(T1.BUT_PATH, '/')
INNER JOIN ELBAT T3
ON T3.BUT_ID = TO_NUMBER(REGEXP_REPLACE(REGEXP_SUBSTR(T1.BUT_PATH, '/[^/]+', 1, X1.RN), '^/'))
GROUP BY T1.BUT_ID,
T1.PARENT_ID,
T1.REFERENCE_CODE,
T1.BUT_PATH;