oracle:查询以输出分隔的ID作为参考代码

时间:2018-08-14 15:26:22

标签: sql oracle

有一个带有业务部门树形结构的表。

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

1 个答案:

答案 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;

db<>fiddle