Как получить ранее измененные записи? - PullRequest
1 голос
/ 13 июня 2019

Как получить ранее измененные записи для определенных данных?
Из приведенных ниже записей я пытался, но не получил идеи сделать это

DECLARE @l_MSISDN AS TABLE 
(
    ID INT IDENTITY(1,1),
    Old NVARCHAR(50),
    New NVARCHAR(50),
    AuthDate DATETIME
)

INSERT INTO @l_MSISDN VALUES
    ('A','B',GETDATE()),
    ('B','C',GETDATE()),
    ('C','D',GETDATE()),
    ('R','T',GETDATE()),
    ('R','Q',GETDATE())

;WITH CTE AS
(
    select  New,OLD,AuthDate 
    from    @l_MSISDN nolock
    UNION ALL
    SELECT * from cte 
    where New = OLD
)

select * from cte
order by AuthDate
Old             New              AuthDate
A               B               2018-04-04 11:06:51.953
B               C               2018-04-04 10:39:03.563
C               D               2014-12-20 06:25:20.397
R               T               2016-02-10 15:25:20.123
Q               R               2015-09-21 15:25:20.330

Я ожидаю вывод как

old               new             Authdate
A                 B               2014-12-20 06:25:20.397
B                 C               2015-09-21 15:25:20.330
C                 D               2016-02-10 15:25:20.123

Я дам ввод как D

1 Ответ

2 голосов
/ 13 июня 2019

Вы не были слишком далеко со своей попыткой. Вам также необходимо ссылаться на исходную таблицу в UNION ALL по JOIN:

DECLARE @Start char(1) = 'D';

SELECT *
INTO #Temp
FROM (VALUES ('A', 'B', CONVERT(datetime,'2018-04-04T11:06:51.953')),
             ('B', 'C', CONVERT(datetime,'2018-04-04T10:39:03.563')),
             ('C', 'D', CONVERT(datetime,'2014-12-20T06:25:20.397')),
             ('R', 'T', CONVERT(datetime,'2016-02-10T15:25:20.123')),
             ('Q', 'R', CONVERT(datetime,'2015-09-21T15:25:20.330'))) V (Old, New, AuthDate);

WITH rCTe AS(
    SELECT T.Old,
           T.New,
           T.AuthDate
    FROM #Temp T
    WHERE T.New = @Start
    UNION ALL
    SELECT T.Old,
           T.New,
           T.AuthDate
    FROM #Temp T
         JOIN rCTE r ON r.Old = T.New)
SELECT r.Old,
       r.New,
       r.AuthDate
FROM rCTe r;

DROP TABLE #Temp;
...