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
Комментариев нет:
Отправить комментарий