WITH RECURSIVE dep_tree AS (
SELECT
0 as lvl,
rdb$dependent_name,
rdb$dependent_type,
rdb$depended_on_name
FROM
rdb$dependencies
WHERE
rdb$depended_on_name = :depname
UNION ALL
SELECT
(t.lvl + 1) as lvl,
d.rdb$dependent_name,
d.rdb$dependent_type,
d.rdb$depended_on_name
FROM
rdb$dependencies d JOIN dep_tree t
ON t.rdb$dependent_name = d.rdb$depended_on_name
AND t.lvl < 5 )
SELECT DISTINCT
rdb$dependent_name,
rdb$dependent_type,
rdb$depended_on_name
FROM
dep_tree
Глубину прекращения поиска мы задаем вручную (в примере -- это константа 5). Если задать слишком много, то запрос будет выполняться слишком долго. Задать мало -- и мы рискуем потерять объекты при большой глубине вложенности связей.
Комментариев нет:
Отправить комментарий