You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL如何递归查询指定package的所有层级依赖关系

可行查询语句

以下是基于递归CTE实现的全量依赖查询语句,直接替换其中的包名和版本号即可使用:

WITH RECURSIVE dependency_tree AS (
    -- 锚点:定位需要查询的根包,层级设为1
    SELECT 
        p.name,
        v.version,
        v.id AS version_id,
        1 AS level
    FROM package p
    INNER JOIN version v ON p.id = v.package_id
    WHERE 
        p.name = 'react-router-dom'
        AND v.version = '5.2.0'
    
    UNION ALL
    
    -- 递归遍历下层依赖,层级逐次+1
    SELECT 
        dep_pkg.name,
        dep_ver.version,
        dep_ver.id AS version_id,
        dt.level + 1 AS level
    FROM dependency_tree dt
    INNER JOIN dependency dep ON dt.version_id = dep.version_id
    INNER JOIN version dep_ver ON dep.dependency_id = dep_ver.id
    INNER JOIN package dep_pkg ON dep_ver.package_id = dep_pkg.id
)
SELECT name, version, level
FROM dependency_tree
ORDER BY level, name;

防循环依赖优化

如果你的存储数据存在循环依赖场景,可以添加已遍历版本ID的检测逻辑,避免出现无限递归:

WITH RECURSIVE dependency_tree AS (
    SELECT 
        p.name,
        v.version,
        v.id AS version_id,
        1 AS level,
        ARRAY[v.id] AS visited_ids
    FROM package p
    INNER JOIN version v ON p.id = v.package_id
    WHERE 
        p.name = 'react-router-dom'
        AND v.version = '5.2.0'
    
    UNION ALL
    
    SELECT 
        dep_pkg.name,
        dep_ver.version,
        dep_ver.id AS version_id,
        dt.level + 1 AS level,
        dt.visited_ids || dep_ver.id
    FROM dependency_tree dt
    INNER JOIN dependency dep ON dt.version_id = dep.version_id
    INNER JOIN version dep_ver ON dep.dependency_id = dep_ver.id
    INNER JOIN package dep_pkg ON dep_ver.package_id = dep_pkg.id
    WHERE dep_ver.id <> ALL(dt.visited_ids)
)
SELECT name, version, level
FROM dependency_tree
ORDER BY level, name;

内容的提问来源于stack exchange,提问作者zemirco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 19:42:01