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

SQL如何实现递归关联查询以回溯指定物料的所有历史前置项

你当前的写法只能实现最多两层的层级查询,无法适配不固定的物料迭代深度,这类无限层级回溯的场景,标准解决方案是使用递归公共表表达式(CTE)实现。

以下是可直接使用的查询示例(以SQL Server为例,其他支持递归CTE的数据库仅需调整字段转义符号即可):

WITH RecursiveItemHistory AS (
    -- 锚点查询:先拿到目标物料的直接前置项
    SELECT
        t1.Item,
        t2.[Previous-Item]
    FROM Table1 t1 (NOLOCK)
    INNER JOIN Table2 t2 (NOLOCK)
        ON t1.Item = t2.[New-Item]

    UNION ALL

    -- 递归查询:逐层向上追溯更早的前置物料
    SELECT
        ri.Item,
        t2.[Previous-Item]
    FROM RecursiveItemHistory ri
    INNER JOIN Table2 t2 (NOLOCK)
        ON ri.[Previous-Item] = t2.[New-Item]
)
SELECT Item, [Previous-Item]
FROM RecursiveItemHistory

运行上述代码后输出结果完全匹配你给出的预期值。

注意事项

  • 如果业务中存在循环映射(如A映射到B、B又映射回A)的情况,可以添加递归层级上限避免死循环,例如SQL Server可在查询末尾添加OPTION (MAXRECURSION 100),将最大递归层级限制为100(可根据业务场景调整数值)。
  • MySQL 8.0+、PostgreSQL、Oracle 11gR2及以上版本均支持递归CTE语法,仅需将字段名的转义符从[]替换为对应数据库的转义符即可(MySQL用反引号`,Oracle用双引号")。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 01:57:02