Я пытаюсь удалить повторяющееся поддерево, возвращаемое предложением "connect by before".Я хочу проверить узел верхнего уровня древовидной иерархии, где пользователь может ввести дочерние идентификаторы, которые уже являются частью поддерева.Взгляните на следующий пример:
SELECT * FROM (
With test_hierarchy as(
SELECT 'a' parent, 'b' child FROM dual UNION ALL
SELECT 'b','c' FROM dual UNION ALL
SELECT 'd','e' FROM dual UNION ALL
SELECT 'e','f' FROM dual UNION ALL
SELECT 'f','g' FROM dual UNION ALL
SELECT 'f','h' FROM dual)
SELECT
parent,
child,
CONNECT_BY_ROOT child AS init_child,
LEVEL,
CONNECT_BY_ISLEAF,
MAX(LEVEL) OVER(
PARTITION BY parent
) AS max_level
FROM
test_hierarchy
WHERE
CONNECT_BY_ISLEAF = 1
START WITH
child IN (
'c', 'b', 'e', 'f', 'h', 'g'
)
CONNECT BY
PRIOR parent = child);
Этот запрос возвращает результат в виде:
P C I LEVEL CONNECT_BY_ISLEAF MAX_LEVEL
- - - ---------- ----------------- ----------
a b b 1 1 2
a b c 2 1 2
d e g 3 1 3
d e f 2 1 3
d e h 3 1 3
d e e 1 1 3
Я хочу вернуть только те узлы верхнего уровня с level = max_level.Т.е. мой запрос должен возвращать результат в виде:
P C I LEVEL CONNECT_BY_ISLEAF MAX_LEVEL
- - - ---------- ----------------- ----------
a b c 2 1 2
d e g 3 1 3
d e h 3 1 3
Если я попытаюсь отфильтровать результаты, используя предложение WHERE как "WHERE level = max_level", Oracle жалуется:
ORA-01788: CONNECT BY clause required in this query block
01788. 00000 - "CONNECT BY clause required in this query block"
Пожалуйста, дайте мнезнать, если у вас есть идея, как это сделать.Спасибо,