【问题标题】:Select all related records选择所有相关记录
【发布时间】:2021-01-01 13:00:34
【问题描述】:

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

意味着当我想更新一条记录时,原始记录必须保持不变,但必须插入一条新记录,其中包含新的 Id 和更新的值,并且修改后的记录 ID 在 Old_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

怎么写成存储过程?

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

有人可以帮忙吗?

【问题讨论】:

  • 没时间写,但递归 CTE 是您应该开始寻找的地方。至少假设“Microsoft SQL db”是指 Sql Server 而不是 Access。
  • 我认为您应该无法更改 id=2 因为有一条 old_id=2 的记录?
  • 向我们展示您的尝试。
  • 我还没有找到答案...

标签: sql sql-server select


【解决方案1】:

您可以使用递归公用表表达式 (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;

【讨论】:

  • 此答案缺少 1、2 或 4 的搜索部分。
猜你喜欢
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-10
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多