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

基于重复记录初始值填充表C列的SQL查询需求

实现重复记录链的初始值填充(C列)

问题背景

现有数据表包含A、B、C三列,数据示例如下:

ABC
100100
101100100
102101100
103103
104103103

其中:

  • 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;

代码说明

  1. 锚点成员:先筛选出所有B为空的初始记录,这些记录的C值就是自身的A值,作为递归的起点;
  2. 递归成员:将后续的重复记录(B不为空)与CTE中的记录关联(通过t.B = cte.A),直接继承根节点的C值;
  3. 最终查询:将递归结果按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 11:26:20