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

SQL Server查询:获取ID变更链的初始值与最终值

查询ID变更链的初始值与最终值

原数据表

changeOrderoldValuenewValue
0ID1ID2
1ID2ID3
2ID6ID7
3ID3ID4
4ID7ID8

需求

提取每条ID变更链的初始值(Oldest)和最终值(Newest),得到如下结果:

OldestNewest
ID1ID4
ID6ID8

解决方案(标准SQL)

可以通过**递归CTE(公共表表达式)**实现链式数据的追踪,以下是两种可行的写法:

写法一:通过分组取最终节点

WITH RECURSIVE change_chain AS (
    -- 定位所有变更链的起点:从未作为newValue出现的oldValue
    SELECT 
        oldValue AS oldest_id,
        oldValue AS current_id,
        newValue AS next_id
    FROM your_table
    WHERE oldValue NOT IN (SELECT newValue FROM your_table)
    
    UNION ALL
    
    -- 递归追踪后续节点
    SELECT 
        cc.oldest_id,
        t.newValue AS current_id,
        t.newValue AS next_id
    FROM change_chain cc
    JOIN your_table t ON cc.next_id = t.oldValue
)
-- 按初始值分组,取组内最后一个节点作为最终值
SELECT 
    oldest_id AS Oldest,
    MAX(current_id) AS Newest
FROM change_chain
GROUP BY oldest_id;

写法二:直接筛选链的末端节点

WITH RECURSIVE change_chain AS (
    -- 定位所有变更链的起点
    SELECT 
        oldValue AS oldest_id,
        newValue AS current_id
    FROM your_table
    WHERE oldValue NOT IN (SELECT newValue FROM your_table)
    
    UNION ALL
    
    -- 递归追踪后续节点
    SELECT 
        cc.oldest_id,
        t.newValue AS current_id
    FROM change_chain cc
    JOIN your_table t ON cc.current_id = t.oldValue
)
-- 筛选出不再作为变更起点的节点(即链的末端)
SELECT 
    oldest_id AS Oldest,
    current_id AS Newest
FROM change_chain
WHERE current_id NOT IN (SELECT oldValue FROM your_table);

逻辑说明

  1. 锚点查询:先找出所有变更链的初始节点——这些ID只出现在oldValue中,从未作为newValue被其他ID指向。
  2. 递归查询:通过关联current_id与oldValue,沿着变更关系逐层追踪,直到链的末端。
  3. 结果提取:要么通过分组取每条链的最后一个节点,要么直接筛选出不再作为变更起点的末端节点,最终得到初始值与最终值的对应关系。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:17:00