代码之家  ›  专栏  ›  技术社区  ›  Sergio Tapia

如何为自引用表创建简单的Select?

  •  5
  • Sergio Tapia  · 技术社区  · 15 年前

    CREATE TABLE perarea
      (
         id_area      INT primary key,
         nombre       VARCHAR2(200),
         id_areapadre INT references perarea(id_area)
      );
    

    1 IT null
    2 Recursos Humanos null
    3 Contabilidad 2
    4 Legal 2
    

    我想要:

    1 IT 
    2 Recursos Humanos 
    3 Contabilidad Recursos Humanos
    4 Legal Recursos Humanos
    

    有什么帮助吗?

    我一辈子都搞不清楚这是怎么回事。

    编辑:

    这个SQL查询可以工作,但不提取名称,只提取父级的ID。有什么帮助吗?

    select * from PerArea
    connect by id_area = id_areapadre;
    
    4 回复  |  直到 15 年前
        1
  •  6
  •   Justin K    15 年前

    作为参考,您也可以通过使用自连接在没有层次结构扩展的情况下执行此操作:

    SELECT p1.id_area, p1.name, COALESCE(p2.name, '')
    FROM perarea p1
         LEFT JOIN perarea p2 ON (p1.id_areapadre = p2.id_area)
    
        2
  •  3
  •   Vincent Malgrat    15 年前

    这是分层查询的一个很好的例子。一个带有连接方式的简单解决方案:

    SQL> SELECT id_area, nombre, PRIOR (nombre)
      2    FROM perarea
      3  CONNECT BY PRIOR (id_area) = id_areapadre
      4   START WITH id_areapadre IS NULL;
    
     ID_AREA NOMBRE            PRIOR(NOMBRE)
    -------- ----------------- -----------------
           1 IT                
           2 Recursos Humanos  
           3 Contabilidad      Recursos Humanos
           4 Legal             Recursos Humanos
    
        3
  •  2
  •   Dave Costa    15 年前

    看起来您需要分层查询:

    select id_area, nombre, sys_connect_by_path(nombre,'/')
      from perarea
      start with id_areapadre is null
      connect by id_areapadre = prior id_area
      order by id_area
    
        4
  •  0
  •   Harrison    15 年前

    您是在寻找rootname(CONNECT\u BY\u ROOT)还是删除“parents”名称的子字符串路径?

     SELECT id_area, 
               nombre, 
               PATHLEVEL , 
               SUBSTR(PATHLEVEL,INSTR(PATHLEVEL,'/',-1,2)+1, INSTR(PATHLEVEL,'/',-1)-INSTR(PATHLEVEL,'/',-1,2)-1) PARENTNAME ,
               rootNAME
        FROM(
        select id_area, nombre, sys_connect_by_path(nombre,'/')  PATHLEVEL,
               CONNECT_BY_ROOT nombre rootNAME,
          from perarea
          start with id_areapadre is null
          connect by id_areapadre = prior id_area
          order by id_area
        );