我有下面的记录集,我试图从给定的父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文件。 –