2013-07-12 6 views
4

У меня есть heirarchical таблицу в форматеУдаление дубликатов поддеревьев из CONNECT-BY запроса в оракула

CREATE TABLE tree_hierarchy (
    id  NUMBER (20) 
,parent_id NUMBER (20) 
); 


INSERT INTO tree_hierarchy (id, parent_id) VALUES (2, 1); 
INSERT INTO tree_hierarchy (id, parent_id) VALUES (4, 2); 
INSERT INTO tree_hierarchy (id, parent_id) VALUES (9, 4); 

При запуске запроса: -

SELECT id,parent_id, 
    CONNECT_BY_ISLEAF leaf, 
    LEVEL, 
    SYS_CONNECT_BY_PATH(id, '/') Path, 
    SYS_CONNECT_BY_PATH(parent_id, '/') Parent_Path 
FROM tree_hierarchy 
WHERE CONNECT_BY_ISLEAF<>0 
    CONNECT BY PRIOR id = PARENT_id 
ORDER SIBLINGS BY ID; 

Результат я получаю, как это: -

"ID" "PARENT_ID" "LEAF" "LEVEL" "PATH" "PARENT_PATH" 

9   4   1  3 "/2/4/9" "/1/2/4" 

9   4   1  2  "/4/9"  "/2/4" 

9   4   1  1  "/9"  "/4" 

Но мне нужен Oracle Sql запрос, который получает меня только этот

Это более простой пример. У меня есть более 1000 записей таким образом. Когда я запускаю указанный выше запрос, он генерирует много дубликатов. Может ли кто-нибудь дать мне общий запрос, который даст полный путь от листа к корень без дубликатов. Спасибо за помощь заранее

ответ

0

Вы должны указать id явно, чтобы построить путь. Теперь ваш запрос строит путь для всех листьев, которые удовлетворяют вашему состоянию. Вы должны использовать «начать с» Давайте попробуем так:

SELECT id,parent_id, 
    CONNECT_BY_ISLEAF leaf, 
    LEVEL, 
    SYS_CONNECT_BY_PATH(id, '/') Path, 
    SYS_CONNECT_BY_PATH(parent_id, '/') Parent_Path 
FROM tree_hierarchy 
WHERE CONNECT_BY_ISLEAF<>0 
    CONNECT BY PRIOR id = PARENT_id 
START WITH id = 2 
ORDER SIBLINGS BY ID; 
+0

Спасибо за ваш reply.But В моем случае это не будет work.Your решения требует корня быть известным в advance.In моего случай, дб может иметь несколько корней и я хотите, чтобы все возможные комбинации листьев и корневых цепей были исключены из дубликатов. – Dilip

+0

Однако дубликатов нет. В результате вашего запроса нет дублированных строк. Он возвращает полный путь для ВСЕХ листьев. Итак, вам нужно подумать о еще одном состоянии, которое вернет только нужную вам строку. Возможно, я не понял этот вопрос четко, но попытаюсь найти эти пути не от родителя к детям, а в противоположном направлении и начинать с листьев. Я думаю, это то, что вам нужно. – bdshadow

3

Корневой узел в конечной иерархии должен быть всегда известно. В соответствии с определением: http://en.wikipedia.org/wiki/Tree_structure Корневой узел - это узел, у которого нет родителей. Чтобы проверить, является ли данный узел корневым узлом, возьмите «parent_id» и проверьте в таблице, если существует запись с этим идентификатором. Запрос может выглядеть следующим образом:

SELECT id,parent_id, 
    CONNECT_BY_ISLEAF leaf, 
    LEVEL, 
    SYS_CONNECT_BY_PATH(id, '/') Path, 
    SYS_CONNECT_BY_PATH(parent_id, '/') Parent_Path 
FROM tree_hierarchy th 
WHERE CONNECT_BY_ISLEAF<>0 
    CONNECT BY PRIOR id = PARENT_id 
START WITH not exists (
     select 1 from tree_hierarchy th1 
     where th1.id = th.parent_id 
) 
ORDER SIBLINGS BY ID; 
Смежные вопросы