Похоже, вам нужен простой рекурсивный запрос, который пересекает дерево вниз, начиная с заданного узла.CTE
возвращает список пар (Parent, Child)
, поэтому я объединил их вместе, чтобы получить список отдельных узлов (и по пути удалить дубликаты).
Обратите внимание, что запрос рекурсивный.CTE (общее табличное выражение) ссылается на себя.
Образцы данных
Я добавил еще несколько строк, чтобы реально увидеть, что происходит.
DECLARE @T TABLE (Parent int, Child int);
INSERT INTO @T VALUES
(100, 101),
(101, 102),
(102, 103),
(103, 104),
(101, 108),
(108, 109),
(208, 209),
(209, 210);
Запрос
WITH
CTE
AS
(
SELECT
Parent, Child
FROM @T
WHERE Parent = 100
UNION ALL
SELECT
T.Parent, T.Child
FROM
CTE
INNER JOIN @T AS T ON T.Parent = CTE.Child
)
SELECT
Parent AS Result
FROM CTE
UNION
SELECT
Child AS Result
FROM CTE
;
Результат
Result
100
101
102
103
104
108
109
Вы можете поместить запрос в хранимую процедуру следующим образом:
CREATE PROCEDURE GetAncestors(@thingID int)
AS
BEGIN
SET NOCOUNT ON;
WITH
CTE
AS
(
SELECT
Example.Parent, Example.Child
FROM Example
WHERE Parent = @thingID
UNION ALL
SELECT
Example.Parent, Example.Child
FROM
CTE
INNER JOIN Example ON Example.Parent = CTE.Child
)
SELECT
Parent AS Result
FROM CTE
UNION
SELECT
Child AS Result
FROM CTE
;
END
GO