1

特に、以下の3つの列が含まれている表があります。これらは DB に保存された 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 に答える