Как я могу создать простой Select для самореферентной таблицы?
Например, у меня есть эта таблица:
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-запрос работает, но не тянет ИМЯ, только идентификатор родителя. Любая помощь?
select * from PerArea
connect by id_area = id_areapadre;
4 ответа
Решение
Для справки, вы также можете сделать это без иерархических расширений, используя самосоединение:
SELECT p1.id_area, p1.name, COALESCE(p2.name, '')
FROM perarea p1
LEFT JOIN perarea p2 ON (p1.id_areapadre = p2.id_area)
Это хороший пример иерархического запроса. Простое решение с 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
Похоже, вы хотите иерархический запрос:
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
Вы ищете корневое имя (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
);