Я хотел бы получить помощь для иерархического запроса (Oracle 11gR2).Мне трудно с такими запросами ...
На самом деле, это вопрос 2 в 1 (требуется 2 разных подхода).
Я ищу способ получитьрасстояние от всех записей индивидов до корня (не наоборот).Мои данные имеют древовидную структуру:
CREATE TABLE MY_TREE
(ID_NAME VARCHAR2(1) PRIMARY KEY,
PARENT_ID VARCHAR2(1),
PARENT_DISTANCE NUMBER(2)
);
INSERT INTO MY_TREE (ID_NAME,PARENT_ID,PARENT_DISTANCE) VALUES('A',NULL,NULL);
INSERT INTO MY_TREE (ID_NAME,PARENT_ID,PARENT_DISTANCE) VALUES('B','A',1);
INSERT INTO MY_TREE (ID_NAME,PARENT_ID,PARENT_DISTANCE) VALUES('C','B',3);
INSERT INTO MY_TREE (ID_NAME,PARENT_ID,PARENT_DISTANCE) VALUES('D','B',5);
INSERT INTO MY_TREE (ID_NAME,PARENT_ID,PARENT_DISTANCE) VALUES('E','C',7);
INSERT INTO MY_TREE (ID_NAME,PARENT_ID,PARENT_DISTANCE) VALUES('F','D',11);
INSERT INTO MY_TREE (ID_NAME,PARENT_ID,PARENT_DISTANCE) VALUES('G','D',13);
Иерархически мои данные выглядят так (но у меня несколько независимых корней и много других уровней):
При первом приближении я ищу запрос, который даст мне такой результат:
LEVEL ROOT NODE ID_NAME ROOT_DISTANCE
----- ---- ---- ------- -------------
1 A null A null
2 A null B 1
3 A B C 4
4 A B E 11
3 A B D 6
4 A D F 17
4 A D G 19
В этом результате
- столбец «NODE» означает ID_NAME ближайшего элемента разбиения
- , столбец «ROOT_DISTANCE» означает расстояние от элемента до корня (например: ROOT_DISTANCE для ID_NAME = G - это расстояние от G до A:G (13) + D (5) + B (1) = 19)
В этом приближении я всегда буду указывать максимум 2 корня.
Второй подход долженбыть сценарием PL / SQL, который будет выполнять те же вычисления (ROOT_DISTANCE), но итеративным способом, и записывать результат в новую таблицу.Я хочу запустить этот скрипт один раз, поэтому все корни (~ 1000) будут обработаны.
Вот как я вижу скрипт:
- Для всех корней нам нужнонайдите связанные листья, а затем рассчитайте расстояние от листа до корня (для всех элементов между листом и корнем) и поместите это в таблицу.
Этот сценарий необходим для «перспектив производительности», поэтому, если элемент уже был рассчитан (например, разделенный узел, который был рассчитан другим листом), нам нужно остановить вычисление и перейти кследующий лист, потому что мы уже знаем результат оттуда до корня.Например, если система вычисляет ECBA, а затем FDBA, раздел BA не должен быть снова рассчитан, поскольку это было сделано при первом проходе.
Вы можете задать один или оба этих вопроса, но мне понадобитсяОтветчик на эти два вопроса.
Спасибо!