WITH RECURSIVE
ns_tree AS (
SELECT
f.filename,
CAST((f.xid || '_' || f.dbid) AS VARCHAR(1024)) AS path,
l2.uses_xid,
l2.uses_dbid
FROM
at_namespace_file f
JOIN at_namespace_file_link l
ON l.uses_xid = f.xid AND l.uses_dbid = f.dbid
LEFT JOIN at_namespace_file_link l2
ON l2.filename = f.filename
WHERE
l.filename = :filename
UNION ALL
SELECT
f.filename,
(t.path || '-' || f.xid || '_' || f.dbid)
AS path,
l.uses_xid,
l.uses_dbid
FROM
ns_tree t
JOIN at_namespace_file f
ON t.uses_xid = f.xid AND t.uses_dbid = f.dbid
JOIN at_namespace_file_link l
ON l.filename = f.filename
WHERE
POSITION ((f.xid || '_' || f.dbid)
IN t.path) = 0)
SELECT
*
FROM
ns_tree
Таблица at_namespace_file содержит список объектов, а at_namespace_file_link -- связи между ними. Вычисление пути (path) и дополнительная проверка через функцию POSITION позволяют избежать зацикливания на кольцевых ссылках, если такие попадутся в исходных данных.
14 сент. 2013 г.
Список объектов в соответствии с заданными зависимостями
Если в предыдущем примере мы ранжировали заданный список объектов, то следующий пример возвращает упорядоченный в соответствии с иерархией зависимости список объектов, от которых зависит указанный объект.
Labels:
SQL
Комментариев нет:
Отправить комментарий