ORACLE 递归获取树形结构数据


1.原始数据结构

2.使用关键字:CONNECT BY NOCYCLE

2.1.ERROR:ORA-01436,可使用关键字“NOCYCLE”

WITH V_ALL AS (
    SELECT 'A' AS CODE, 'A1' AS ITEM_CODE FROM DUAL
    UNION ALL
    SELECT 'A' AS CODE, 'A2' AS ITEM_CODE FROM DUAL
    UNION ALL
    SELECT 'A' AS CODE, 'B' AS ITEM_CODE FROM DUAL
    UNION ALL
    SELECT 'B' AS CODE, 'B1' AS ITEM_CODE FROM DUAL
    UNION ALL
    SELECT 'B' AS CODE, 'B2' AS ITEM_CODE FROM DUAL
    UNION ALL
    SELECT 'B' AS CODE, 'C' AS ITEM_CODE FROM DUAL
    UNION ALL
    SELECT 'C' AS CODE, 'D' AS ITEM_CODE FROM DUAL
)
--SELECT * FROM V_ALL;
SELECT
    CONNECT_BY_ROOT(A.CODE) AS CODE
    , A.ITEM_CODE
    , LEVEL
FROM
    V_ALL A
CONNECT BY NOCYCLE A.CODE = PRIOR A.ITEM_CODE
;

2.2.结果

3.递归函数脚本

3.1.ERROR:ORA-32039: 递归 WITH 子句必须具有列别名列表

3.1.解决方法 - 临时表后加上别名清单:RESULT(CODE, ITEM_CODE, NODE_INDEX, ROOT_CODE)

WITH V_ALL AS (
    SELECT 'A' AS CODE, 'A1' AS ITEM_CODE FROM DUAL
    UNION ALL
    SELECT 'A' AS CODE, 'A2' AS ITEM_CODE FROM DUAL
    UNION ALL
    SELECT 'A' AS CODE, 'B' AS ITEM_CODE FROM DUAL
    UNION ALL
    SELECT 'B' AS CODE, 'B1' AS ITEM_CODE FROM DUAL
    UNION ALL
    SELECT 'B' AS CODE, 'B2' AS ITEM_CODE FROM DUAL
    UNION ALL
    SELECT 'B' AS CODE, 'C' AS ITEM_CODE FROM DUAL
    UNION ALL
    SELECT 'C' AS CODE, 'D' AS ITEM_CODE FROM DUAL
), V_G AS (
    SELECT CODE FROM V_ALL GROUP BY CODE
)
, RESULT(CODE, ITEM_CODE, NODE_INDEX, ROOT_CODE) as (
    SELECT V_G.CODE, V_ALL.ITEM_CODE AS ITEM_CODE, 1 AS NODE_INDEX , V_G.CODE AS ROOT_CODE
    FROM V_ALL
    INNER JOIN V_G ON V_G.CODE = V_ALL.CODE
    UNION ALL
    SELECT RESULT.CODE, V_ALL.ITEM_CODE, RESULT.NODE_INDEX + 1 AS NODE_INDEX, RESULT.ROOT_CODE
    FROM V_ALL
    INNER JOIN RESULT ON RESULT.ITEM_CODE = V_ALL.CODE
)
SELECT * FROM result
ORDER BY CODE, NODE_INDEX, ITEM_CODE

;

3.2.结果

Reference:


https://blog.csdn.net/m0_46636892/article/details/122984132

https://blog.csdn.net/wang_yunj/article/details/51040029

oracle递归with

 https://oracle-base.com/articles/11g/recursive-subquery-factoring-11gr2

DB