【发布时间】:2016-08-09 19:37:36
【问题描述】:
我有以下记录集,我正在尝试从给定的父 ID 获取链接 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 .
提前感谢任何帮助或指导
【问题讨论】:
-
你想要的最终输出是什么?
-
很难理解您要达到的目标...为什么不能简单地使用
SELECT * FROM @TableVals WHERE [NewId] = '00897'为什么不想要00903WHEN ID 是00897?跨度> -
我也不确定这里到底发生了什么,但我有一个评论。您可以将链接字段设为空并将值移动到存档字段 (UsedToBeLinkedTo),而不是尝试合并 IsUnlinked 字段。我只是建议这是因为层次结构的标准 cte 有据可查。
-
是的,我认为这将不得不导致架构更改。或 CTE 以外的替代方案。谢谢
标签: sql sql-server sql-server-2008 tsql ssms