我有下面的記錄集,我試圖從給定的父ID得到鏈接ID的列表。TSQL遞歸CTE - 獲取子女記錄ID至某一點
DECLARE @TableVals TABLE
([ID] NVARCHAR(5),
[NewId] NVARCHAR(5),
[LinkDate] DATETIME,
[IsUnlink] BIT);
INSERT INTO @TableVals
VALUES ('00899', '00897', '01 Jan 2012 13:46:30', 0),
('00900', '00903', '01 Jan 2012 12:05:16', 0),
('00901', '00903', '01 Jan 2012 11:03:13', 1),
('00903', '00897', '01 Jan 2012 11:01:57', 0),
('00902', '00903', '01 Jan 2012 10:44:00', 0),
('00898', '00906', '01 Jan 2012 10:34:36', 1),
('00895', '00897', '01 Jan 2012 10:25:51', 0),
('00893', '00897', '01 Jan 2012 10:25:33', 0),
('00891', '00897', '01 Jan 2012 10:24:48', 0)
我有這種CTE其返回兩個意外的值(00900
和00902
),因爲這些被鏈接到00903
這是從解除鏈接。我試圖在LinkDate
上進行檢查,但我懷疑我沒有把它做得很正確。
DECLARE @ID NVARCHAR(5) = '00897'
;WITH CurrentLinks AS
(
SELECT
[tv].[ID], [tv].[NewId], [tv].[LinkDate]
FROM
@TableVals [tv]
WHERE
[tv].[NewId] = @ID
AND [tv].[IsUnlink] != 1
UNION ALL
SELECT
[tv].[ID], [tv].[NewId], [tv].[LinkDate]
FROM
@TableVals [tv]
INNER JOIN
CurrentLinks [cl] ON [tv].[NewId] = [cl].[ID]
AND [tv].[IsUnlink] != 1
)
SELECT
[cl].[ID]
FROM
CurrentLinks cl
WHERE
[cl].[id] != @ID
AND NOT EXISTS (SELECT 1
FROM @TableVals tv
WHERE (tv.ID = cl.ID OR tv.NewId = cl.ID)
AND tv.LinkDate > cl.LinkDate)
ORDER BY
[cl].[LinkDate] DESC;
當ID設置爲00903
我希望00900
和00902
要返回,當ID 00897
在傳遞我希望00899
,00895
,00893
和00891
。
預先感謝任何幫助或方向
你想要的最終輸出是什麼? – techspider
很難理解你要存檔的內容......爲什麼不能簡單地'SELECT * FROM @TableVals WHERE [NewId] ='00897''你爲什麼不要'00903'當ID是' 00897'? – techspider
我也不確定這裏發生了什麼,但我有一個評論。您可以清空鏈接字段並將該值移至歸檔字段(UsedToBeLinkedTo),而不是嘗試合併IsUnlinked字段。我只是建議將此作爲層次結構的標準cte文件。 –