0

我正在解决一个问题,到目前为止,我能想到的唯一解决方案是使用带有 select 语句的 while 循环,但我正在寻找替代方案。情况是使用的一个表不使用更新语句来保存记录,当更新记录时,会插入一条带有信息的新记录并分配一个新的主键。我的任务是使用任何主键来提取先前键的历史记录,这将通过一个由三列 table_PK、updatedFrom_id 和 updatedTo_id 组成的新表来处理。

任何人都知道如何避免使用while循环来选择所有相互关联的id?可以出现在任一列中,但如果没有更新,则不会出现在任一列中,并且对于可以更新的次数没有限制,并且该语句应该能够检索更新的内容和如果它已更新它已更新到什么。

提前感谢您的帮助!

更新信息:

桌子

UpdateLinking

列:

UpdateLinking_PK,
UpdatedFrom_id,
UpdatedTo_id

示例数据:

UpdateLinking_PK UpdatedFrom_id UpdatedTo_id
77              11             22
78              22             33
79              33             44
80              44             55
81              55             66

UpdateFrom 和 UpdateTo 都是来自单独表的键,实际上可以向该表中的列添加更新,但由于大小和它不会被大量使用,将单独列出更新。我想输入 UpdateFrom 或 UpdateTo id 并返回 updatedFrom 和 updatedTo。如果输入的 Id 参数在 updatedTo 中,我想检查它是否在 updatedFrom 列中并跟随它,直到最后一个 UpdatedTo id 没有出现在 updatedFrom 列中,反之亦然。

输入上述任何 id 的结果集应返回 UpdatedFrom_id 中的所有内容和 UpdatedTo_id 列中的所有内容。

如果添加了一行:

UpdateLinking_PK UpdatedFrom_id UpdatedTo_id
82                  88              111

如果传递的 parameterId 为 44,则应排除此项

4

3 回答 3

1
WITH    q (id) AS
        (
        SELECT  id
        FROM    mytable
        WHERE   id = @myid
        UNION ALL
        SELECT  updatedFrom_id
        FROM    q
        JOIN    history
        ON      updatedTo_id = id
        )
SELECT  *
FROM    q
于 2013-09-19T13:26:55.210 回答
0

您是否考虑过使用递归 CTE?

于 2013-09-19T13:24:03.197 回答
0

SQL Server 2012 中的以下查询可以满足您的需求:

select u.table_Pk,
       lag(UpdatedId) over (partition by u.table_Pk order by UpdatedId) as UpdatedFrom_Id,
       u.updatedId as UpdatedTo_Id
from updates u;

此版本假定UpdatedId按顺序插入列,因为您没有提及可用于定义“上一个”的日期时间字段(或其他字段)。

在 SQL Server 2012 之前,该lag()功能不可用。这是一个替换:

select u.table_Pk,
       (select top 1 UpdatedId
        from updated u2
        where u2.table_Pk = u.table_Pk and u2.UpdatedId < u.UpdatedId
        order by u2.UpdatedId desc
       ) as UpdatedFrom_Id,
       u.updatedId as UpdatedTo_Id
from updates u;
于 2013-09-19T13:28:52.237 回答