Есть таблица с данными в виде дерева. Необходимо написать запрос для получения дерева от корневого узла, узел 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