2010-06-30 2 views
4

К примеру, у меня есть эта таблица:Как создать простой выбор для собственной ссылочной таблицы?

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 

Любая помощь?

Я не могу на всю жизнь понять, как этот выбор будет.

Edit:

Этот SQL-запрос работает, но не тянет ИМЯ, только идентификатор родителя. Любая помощь?

select * from PerArea 
connect by id_area = id_areapadre; 
+1

возможно дубликат [Иерархическая Query] (http://stackoverflow.com/questions/1443860/hierarchical-query) – APC

+0

Oracle имеет свой собственный синтаксис для обработки иерархических запросов, которые не является интуитивным: CONNECT BY. Вопрос, который я предложил в качестве дубликата shoudl, объясняет это вам. – APC

+0

@APC: Не 11g добавить рекурсивный подзапрос факторинга (AKA CTE)? –

ответ

6

Для справки, вы также можете сделать это без иерархических расширений с помощью автообъединение:

SELECT p1.id_area, p1.name, COALESCE(p2.name, '') 
FROM perarea p1 
    LEFT JOIN perarea p2 ON (p1.id_areapadre = p2.id_area) 
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 
+1

Это работает! Но как я могу показать родительскому шоу «Рекурсос Гуманос», намереваясь «/ Recursos Humanos/Servicios Al Empleado»? Благодаря! –

+0

Просто замените символ '/', а затем подстройте результат, чтобы вычесть длину текущего nombre –

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 
    ); 
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 
Смежные вопросы