Получить ВСЕ дочерние элементы последнего уровня (листы) с узла (иерархические запросы Oracle 11G)

Я пытаюсь и ищу способ получить ВСЕХ детей (листьев) последнего уровня из узла, в иерархическом запросе в базе данных Oracle 11g.

У меня есть 2 таблицы: "Узлы" (список всех узлов с их соответствующим значением) и "Отношения", которые определяют отношения отца и ребенка:


--NODES--

 ID_NODE    -      VALUE
1       3
2       6
3       9
4       2
5       4
6       5
7       2
8       7
9       8
10      1

--СВЯЗЬ--

ID_FATHER    -   ID_CHILD
1       2
1       3
1       4
2       5
2       6
4       7
5       8
5       9
7       10  

Я читал о CONNECT_BY_ISLEAF, который возвращает 1, если это лист, но я не могу запросить CONNECT_BY_ISLEAF, как в примере с Oracle, и я не получил никакого результата. Хотя я не знаю точно, как сделать запрос именно с помощью этой функции (например, используя условие case)?

Большое спасибо!

2 ответа

Решение

Я думаю, что-то подобное должно сделать свое дело:

SELECT * FROM
(SELECT n.id, n.val, CONNECT_BY_ISLEAF isleaf FROM NODES n 
       LEFT JOIN RELATION r ON n.id = r.id_child
CONNECT BY PRIOR n.id = r.id_father
START WITH r.id_father IS NULL)
WHERE isleaf = 1

Да, и, кстати, вы можете получить все листья, даже не используя иерархический запрос. Просто выберите все узлы, которые не являются родительскими узлами для любого узла из таблицы отношений. Что-то вроде того:

SELECT n.* FROM NODES n
WHERE NOT EXISTS (SELECT ID_FATHER FROM RELATION r
                  WHERE r.id_father = n.id)

Чтобы получить листовые узлы из указанного узла, просто измените условие в предложении START WITH, чтобы запустить дерево в обратном направлении от интересующего вас узла. Например, этот запрос вернет вам все дочерние листья узла с id = 5:

SELECT * FROM
(SELECT n.id, n.val, CONNECT_BY_ISLEAF isleaf FROM NODES n 
       LEFT JOIN RELATION r ON n.id = r.id_child
CONNECT BY PRIOR n.id = r.id_father
START WITH n.id = 5)
WHERE isleaf = 1

Вы можете просто использовать CONNECT_BY_ISLEAF.

SELECT n.id, n.val
FROM NODES n 
LEFT JOIN RELATION r ON (n.id = r.id_child)
WHERE CONNECT_BY_ISLEAF = 1
CONNECT BY PRIOR n.id = r.id_father
START WITH r.id_father IS NULL
Другие вопросы по тегам