首页 > 解决方案 > 选择所有相关记录

问题描述

我有一个存储记录的表(在 SQL Server 中),如下所示。的目的Old_Id是用于更改跟踪。

这意味着当我想更新一条记录时,原始记录必须保持不变,但必须插入一条新记录,其中包含一个新的Id和更新的值,并且在Old_Id列中包含修改后记录的 ID

Id   Name    Old_Id  
---------------------
1    Paul     null
2    Paul      1
3    Jim      null
4    Paul      2
5    Tim      null 

我的问题是:

当我搜索 id = 1 或 2 或 4 时,我想选择所有相关记录。

在这种情况下,我想查看以下 id 的记录:1、2、4

怎么写成存储过程?

即使这样做是不好的做法,我也无法更改此逻辑,因为它是遗留数据库并且它是一个相当大的数据库。

有人能帮忙吗?

标签: sqlsql-serverselect

解决方案


您可以使用递归公用表表达式 (CTE)

WITH cte_history AS (
    SELECT       
        h.id, 
        h.name,
        h.old_id
        
    FROM       
        history h
    WHERE old_id IS NULL
      and id in (1,2,4)
    UNION ALL
    SELECT 
        e.id, 
        e.name,
        e.old_id
    FROM 
        history e
        INNER JOIN cte_history o 
            ON o.id = e.old_id
)
SELECT * FROM cte_history;

推荐阅读