如何编写MS SQL查询实现父子客户数据分组展示
MS SQL实现父子客户关联层级展示
嘿,这个父子客户关联展示的需求用MS SQL的递归CTE就能轻松搞定,我给你捋清楚步骤和代码!
需求背景
现有一个客户表,通过ParentId字段关联父子客户关系,表结构和数据如下:
| CustId | CustName | ParentId |
|---|---|---|
| 1 | Cust1 | 0 |
| 2 | Cust2 | 0 |
| 3 | Sub2Cust1 | 1 |
| 4 | Cust3 | 0 |
| 5 | Sub1Cust1 | 1 |
| 6 | Sub1Cust2 | 2 |
| 7 | Sub2Cust2 | 2 |
| 8 | Sub4Cust1 | 1 |
| 9 | Sub1Cust3 | 4 |
| 10 | Sub3Cust1 | 1 |
我们需要编写查询,让父客户排在前面,对应的子客户紧跟其后,实现父子关联的层级展示效果。
解决方案:递归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排序后,顶级客户会排在最前面,它的所有子客户按顺序紧跟,完美实现你要的父子关联展示效果。
输出效果
运行上述查询后,输出结果如下(和你期望的示例一致):
| CustId | CustName | ParentId |
|---|---|---|
| 1 | Cust1 | 0 |
| 5 | Sub1Cust1 | 1 |
| 3 | Sub2Cust1 | 1 |
| 10 | Sub3Cust1 | 1 |
| 8 | Sub4Cust1 | 1 |
| 2 | Cust2 | 0 |
| 6 | Sub1Cust2 | 2 |
| 7 | Sub2Cust2 | 2 |
| 4 | Cust3 | 0 |
| 9 | Sub1Cust3 | 4 |
内容的提问来源于stack exchange,提问作者tgeek001
相关产品推荐
相关产品推荐

