Дерево

Есть таблица с данными в виде дерева. Необходимо написать запрос для получения дерева от корневого узла, узел 5 и все его потомки не должны попасть в результат, нужно вывести для каждого узла имя его родителя, данные отсортировать в порядке возрастания ID с учетом иерархии.

CREATE TABLE "TREE" 
("ID" INTEGER,
 "PID" INTEGER,
 "NAM" VARCHAR2(256)
) NOLOGGING TABLESPACE MIRAVILD_DATA;
/

INSERT INTO tree (id, pid, nam) VALUES (1, NULL, 'Корень');
INSERT INTO tree (id, pid, nam) VALUES (2, 1, 'Узел2');
INSERT INTO tree (id, pid, nam) VALUES (3, 1, 'Узел3');
INSERT INTO tree (id, pid, nam) VALUES (4, 2, 'Узел4');
INSERT INTO tree (id, pid, nam) VALUES (5, 4, 'Узел5');
INSERT INTO tree (id, pid, nam) VALUES (6, 5, 'Узел6');
INSERT INTO tree (id, pid, nam) VALUES (7, 4, 'Узел7');

COMMIT WORK;
/

Варианты запроса:

SELECT t.id, t.pid, t.nam, PRIOR nam AS parent_nam
  FROM tree t
CONNECT BY PRIOR t.id = t.pid
       AND t.id <> 5
 START WITH t.id = 1;
/

SELECT t.id, t.pid, t.nam, PRIOR t.nam AS parent_nam
  FROM tree t
 START WITH t.pid IS NULL
CONNECT BY PRIOR t.id = t.pid
       AND t.id <> 5;
/

Результат:

ID	PID	NAM	PARENT_NAM
1		Корень	
2	1	Узел2	Корень
4	2	Узел4	Узел2
7	4	Узел7	Узел4
3	1	Узел3	Корень

P.S.
Конфигурация СУБД — Oracle Database 11g Express Edition Release 11.2.0.2.0
IDE — PL/SQL Developer Version 11.0.6.1776

Tags: ,

Comments are closed.