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

时间:2010-06-30 17:02:40

标签: sql oracle select hierarchical-data

例如,我有这张表:

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查询有效,但不会提取NAME,只会提取父级的ID。有什么帮助吗?

select * from PerArea
connect by id_area = id_areapadre;

4 个答案:

答案 0 :(得分:6)

作为参考,您也可以使用自联接来执行此操作而不使用分层扩展:

SELECT p1.id_area, p1.name, COALESCE(p2.name, '')
FROM perarea p1
     LEFT JOIN perarea p2 ON (p1.id_areapadre = p2.id_area)

答案 1 :(得分:3)

这是分层查询的一个很好的例子。一个带CONNECT BY的简单解决方案:

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

答案 2 :(得分:2)

看起来你想要一个分层查询:

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

答案 3 :(得分:0)

您正在寻找根名称(CONNECT_BY_ROOT)或取出“父母”名称的子串路径吗?

 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
    );