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

如何用SQL查询关联公司链路直至找到'MAIN'主记录

全量表公司父子层级递归查询方案

你当前用于测试的基础查询语句如下:

SELECT
    parent_company_component_id
    ,company_component_id
    ,name
    ,valid_cpy_compnt_type_cs_name
FROM dbo.cs_company_component
WHERE company_component_id IN (10217,7726,3109)

需求实现思路

无需提前指定测试ID,通过递归CTE(通用表达式)遍历全量表的父子关联关系,从所有顶层MAIN类型的公司向下遍历所有关联子公司,最终返回每一条公司记录对应的顶层主公司关联信息。

实现代码

核心逻辑兼容所有支持递归CTE的数据库(SQL Server、MySQL 8.0+、PostgreSQL等),示例语法如下:

-- 注:SQL Server环境无需加RECURSIVE关键字,MySQL 8.0+/PostgreSQL需要在WITH后添加RECURSIVE
WITH company_hierarchy AS (
    -- 锚点成员:先提取所有顶层MAIN公司作为递归起点
    SELECT
        parent_company_component_id
        ,company_component_id
        ,name
        ,valid_cpy_compnt_type_cs_name
        -- 存储顶层MAIN公司的ID和名称,后续递归会一直携带该值
        ,company_component_id AS main_company_id
        ,name AS main_company_name
    FROM dbo.cs_company_component
    WHERE valid_cpy_compnt_type_cs_name = 'MAIN'
        -- 若顶层公司的判断规则是父ID为空,可补充条件:AND parent_company_component_id IS NULL

    UNION ALL

    -- 递归成员:遍历所有子公司,继承父节点携带的顶层MAIN信息
    SELECT
        c.parent_company_component_id
        ,c.company_component_id
        ,c.name
        ,c.valid_cpy_compnt_type_cs_name
        ,ch.main_company_id
        ,ch.main_company_name
    FROM dbo.cs_company_component c
    INNER JOIN company_hierarchy ch 
        ON c.parent_company_component_id = ch.company_component_id
)
-- 最终查询所有层级的公司和对应顶层MAIN的关联数据
SELECT * FROM company_hierarchy
-- 若需要限制递归深度避免循环关联,SQL Server环境可添加如下选项(例如最大递归100层)
-- OPTION (MAXRECURSION 100)

补充说明

  • 若存在循环关联的异常数据,建议添加递归深度限制,避免查询报错
  • 若需要自定义返回字段,可在最终查询中按需筛选company_hierarchy的字段即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:54:02