1

我有一张表格,其中包括以下三列。这些是保存在数据库中的 ID 更改,在这种情况下,ID 已从 1->2->3->4 变化。

oldID    | newID   | added  
1        | 2       | 2012-11-23  
2        | 3       | 2012-11-24  
3        | 4       | 2012-11-25 
4        | 1       | 2012-11-26

我想做的是发送一个oldID参数并返回newID,逐步完成更改。例如,如果我发送2它返回1

我在下面的 SQL 查询中没有得到任何信息,因为我真的不知道自己在做什么。

DECLARE @dateCurrent datetime
DECLARE @datePrevious datetime
DECLARE @oldID int
SET @dateCurrent = '1970-01-01'
SET @datePrevious = '1970-01-01'
SET @oldID = '2'

WHILE (@dateCurrent >= @datePrevious)
    BEGIN
        SELECT @oldID = newID, @datePrevious = added
        FROM theTable
        WHERE oldID = @oldID
    END
4

2 回答 2

1

如果要递归,可以使用公用表表达式

例如:

;with cte as 
(
select *, 0 as level from yourtable
union all
select t1.old, cte.new, t1.dateadded, level + 1 from yourtable t1
    inner join cte on t1.new = cte.old
    and t1.dateadded<cte.dateadded
) 
    select old, new from 
    (select old, new, ROW_NUMBER() over (partition by old order by level desc) rn from cte)
    v 
    where rn=1
于 2012-11-30T11:29:47.457 回答
0

我同意这可能看起来不是最好的解决方案,但我不打算更改自 95 年以来一直运行的系统中的某些内容。

我让它像这样工作:

DECLARE @dateCurrent datetime
DECLARE @datePrevious datetime
DECLARE @oldID int
SET @dateCurrent = '1970-01-01'
SET @datePrevious = '1970-01-01'
SET @oldID = '2'

WHILE (@datePrevious <= @dateCurrent )
BEGIN
SET @datePrevious = @dateCurrent 
SELECT @dateCurrent = t2.added, @oldID = t1.newID
from theTable
     inner join theTable t2
     on t2.oldID = t1.newID
     where t1.oldID = @oldID 
END
SELECT @oldID
于 2012-11-30T12:49:37.433 回答