查找每条记录所属的顶级父组

Find the top-level parent group each record belongs to

我有 hierarchical data 具有以下结构。级别是 1 到 6,所以不是进行 6 次连接然后合并,而是如何找到顶级父级(没有 parent_nr)。

我试过接受的 answer here,

SELECT
  aa.code_nr,
  aa.parent_nr,
  CONNECT_BY_ROOT aa.code_nr AS "Top Level ID"
FROM mytable_t aa
CONNECT BY PRIOR aa.code_nr = aa.parent_nr
;

但它只给我下一级别 "Top Level ID" 而不是最终级别 (A)

Oracle 设置:

CREATE TABLE my_table ( code_nr, parent_nr ) AS (
  SELECT 'A', NULL FROM DUAL UNION ALL
  SELECT 'A.1', 'A' FROM DUAL UNION ALL
  SELECT 'A.1.1', 'A.1' FROM DUAL UNION ALL
  SELECT 'A.1.1.1', 'A.1.1' FROM DUAL UNION ALL
  SELECT 'A.1.1.2', 'A.1.1' FROM DUAL UNION ALL
  SELECT 'A.1.1.1.1', 'A.1.1.1' FROM DUAL UNION ALL
  SELECT 'A.1.1.2.1', 'A.1.1.2' FROM DUAL UNION ALL
  SELECT 'A.1.1.2.2', 'A.1.1.2' FROM DUAL;

查询:

SELECT LEVEL,
       code_nr AS root_code_nr,
       CONNECT_BY_ROOT( code_nr ) AS code_nr
FROM   my_table
WHERE  CONNECT_BY_ISLEAF = 1
CONNECT BY PRIOR parent_nr = code_nr;

输出:

LEVEL ROOT_CODE CODE_NR 
----- --------- ---------
    1 A         A        
    2 A         A.1      
    3 A         A.1.1    
    4 A         A.1.1.1  
    5 A         A.1.1.1.1
    4 A         A.1.1.2  
    5 A         A.1.1.2.1
    5 A         A.1.1.2.2

您可以尝试以下方法:

SELECT
  aa.code_nr,
  aa.parent_nr,
  substr(SYS_CONNECT_BY_PATH(aa.code_nr, '/'),2,instr(SYS_CONNECT_BY_PATH(aa.code_nr, '/'),'/'))
FROM mytable_t aa
CONNECT BY PRIOR aa.code_nr = aa.parent_nr
;