如何为所有记录返回根CustomerID?递归CTE问题求助
解决方案:递归CTE传递根节点CustomerID
你的核心问题是原递归CTE未保留并传递根节点的CustomerID,仅计算了层级。要实现需求,需在锚点查询中定义根节点ID字段,并在递归环节继承该值。
修改后的递归CTE代码
;WITH root_customerID_cte AS ( -- 锚点查询:获取根节点,将自身CustomerID设为RootCustomerID SELECT CustomerGUID, CustomerID, CustomerName, DepartmentName, ParentGUID, CustomerID AS RootCustomerID, 1 AS level FROM dbo.Customer WHERE ParentGUID IS NULL AND CustomerName LIKE '%Customer1%' UNION ALL -- 递归查询:关联父节点,直接继承根节点ID SELECT c.CustomerGUID, c.CustomerID, c.CustomerName, c.DepartmentName, c.ParentGUID, r.RootCustomerID, r.level + 1 FROM dbo.Customer c INNER JOIN root_customerID_cte r ON c.ParentGUID = r.CustomerGUID WHERE c.CustomerName LIKE '%Customer1%' ) -- 筛选目标字段输出 SELECT CustomerID, CustomerName, DepartmentName, RootCustomerID FROM root_customerID_cte ORDER BY CustomerID;
关键说明
- 锚点环节:针对
ParentGUID IS NULL的根节点,新增RootCustomerID字段,值为自身的CustomerID(根节点的根就是自己)。 - 递归环节:关联父节点后,直接复用父节点的
RootCustomerID,确保所有子节点、孙节点都指向同一根节点ID。 - 最终查询仅保留你需要的四个字段,剔除冗余的GUID、父节点ID和层级字段。
输出验证
执行代码后将得到符合预期的结果:
| CustomerID | CustomerName | DepartmentName | RootCustomerID |
|---|---|---|---|
| 1 | Customer1 | Corporate | 1 |
| 2 | Customer1 | Department1 | 1 |
| 3 | Customer1 | SubDepartment1 | 1 |
内容的提问来源于stack exchange,提问作者Rob Hall
相关产品推荐
相关产品推荐

