基于重复记录初始值填充表C列的SQL查询需求
实现重复记录链的初始值填充(C列)
问题背景
现有数据表包含A、B、C三列,数据示例如下:
| A | B | C |
|---|---|---|
| 100 | 100 | |
| 101 | 100 | 100 |
| 102 | 101 | 100 |
| 103 | 103 | |
| 104 | 103 | 103 |
其中:
- B列为空的是重复链的初始记录,C值等于自身A值;
- B列不为空的记录,指向其前序重复项的A值,需要将C列填充为该重复链最顶端的初始A值。
解决方案:递归CTE查找根节点
这是典型的层级递归查找场景,我们可以用递归公共表表达式(CTE)沿着B列的指向,找到每条记录对应的根节点(B为空的初始A值),以此填充C列。
假设表名为your_table,SQL语句如下:
WITH RECURSIVE cte AS ( -- 锚点:取出所有初始记录,C值为自身A SELECT A, B, A AS C FROM your_table WHERE B IS NULL OR B = '' -- 根据B列实际类型调整,数值型用IS NULL,字符串型可能需要判断空串 UNION ALL -- 递归:关联子节点,继承根节点的C值 SELECT t.A, t.B, cte.C FROM your_table t JOIN cte ON t.B = cte.A ) SELECT A, B, C FROM cte ORDER BY A;
代码说明
- 锚点成员:先筛选出所有B为空的初始记录,这些记录的C值就是自身的A值,作为递归的起点;
- 递归成员:将后续的重复记录(B不为空)与CTE中的记录关联(通过
t.B = cte.A),直接继承根节点的C值; - 最终查询:将递归结果按A排序,得到和示例一致的输出。
注意事项
- 如果B列是字符串类型,空值可能存储为空串
'',需要调整WHERE条件为B IS NULL OR B = ''; - 若使用Oracle数据库,可改用层级查询语法:
SELECT A, B, CONNECT_BY_ROOT A AS C FROM your_table START WITH B IS NULL OR B = '' CONNECT BY PRIOR A = B ORDER BY A;
内容的提问来源于stack exchange,提问作者hema
相关产品推荐
相关产品推荐

