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

如何编写MS SQL查询实现父子客户数据分组展示

MS SQL实现父子客户关联层级展示

嘿,这个父子客户关联展示的需求用MS SQL的递归CTE就能轻松搞定,我给你捋清楚步骤和代码!

需求背景

现有一个客户表,通过ParentId字段关联父子客户关系,表结构和数据如下:

CustIdCustNameParentId
1Cust10
2Cust20
3Sub2Cust11
4Cust30
5Sub1Cust11
6Sub1Cust22
7Sub2Cust22
8Sub4Cust11
9Sub1Cust34
10Sub3Cust11

我们需要编写查询,让父客户排在前面,对应的子客户紧跟其后,实现父子关联的层级展示效果。

解决方案:递归CTE实现层级排序

递归公共表表达式(CTE)是MS SQL处理层级数据的绝佳工具,直接上代码:

WITH RecursiveCustomers AS (
    -- 锚点成员:选取所有顶级父客户(ParentId=0)
    SELECT 
        CustId, 
        CustName, 
        ParentId,
        -- 生成排序路径,用于控制父子顺序
        CAST(CustId AS VARCHAR(MAX)) AS SortPath
    FROM Customers
    WHERE ParentId = 0

    UNION ALL

    -- 递归成员:关联父节点和子节点
    SELECT 
        c.CustId, 
        c.CustName, 
        c.ParentId,
        -- 拼接排序路径,保证子节点紧跟对应父节点
        rc.SortPath + '.' + CAST(c.CustId AS VARCHAR(MAX)) AS SortPath
    FROM Customers c
    INNER JOIN RecursiveCustomers rc ON c.ParentId = rc.CustId
)
-- 最终查询,按排序路径输出
SELECT 
    CustId, 
    CustName, 
    ParentId
FROM RecursiveCustomers
ORDER BY SortPath;

代码说明

  • 锚点成员:先筛选出所有顶级客户(ParentId=0),同时生成SortPath字段,记录当前节点的层级路径,初始值为顶级客户的CustId。
  • 递归成员:通过INNER JOIN把原表中的子节点和递归CTE里的父节点关联起来,同时将父节点的SortPath和子节点的CustId拼接,形成子节点的排序路径——这样就能保证子节点紧跟在父节点后面。
  • 最终排序:按SortPath排序后,顶级客户会排在最前面,它的所有子客户按顺序紧跟,完美实现你要的父子关联展示效果。

输出效果

运行上述查询后,输出结果如下(和你期望的示例一致):

CustIdCustNameParentId
1Cust10
5Sub1Cust11
3Sub2Cust11
10Sub3Cust11
8Sub4Cust11
2Cust20
6Sub1Cust22
7Sub2Cust22
4Cust30
9Sub1Cust34

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:13:20