У меня есть следующий набор записей, который я пытаюсь получить список связанных идентификаторов из заданного родительского идентификатора.TSQL Рекурсивный CTE - получить идентификатор записи до определенной точки
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)
У меня есть этот КТР, который возвращает две неожиданных значений (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' WHEN ID является ' 00897 '? – techspider
Я также не совсем уверен, что здесь происходит, но у меня есть комментарий. Вы можете удалить поле ссылки и перенести значение в поле архива (UsedToBeLinkedTo), а не пытаться включить поле IsUnlinked. Я предлагаю это только в качестве стандартного элемента иерархии, хорошо документированного. –