【问题标题】:Find the top-level parent group each record belongs to查找每条记录所属的顶级父组
【发布时间】:2017-05-05 09:44:28
【问题描述】:

我有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
;

但它只给了我下一个级别“顶级 ID”,而不是最终级别 (A)

【问题讨论】:

    标签: sql oracle hierarchy


    【解决方案1】:

    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
    

    【讨论】:

      【解决方案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
      ;
      

      【讨论】:

      • 感谢您的回答。我选择了另一个,因为它稍微简单一些。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      相关资源
      最近更新 更多