Я не вижу дубликатов.
Ваш код возвращает следующие данные на предоставленных вами данных:
Id ParentId
1
2 1
3 1
5 3
4 2
, что вы хотите.
Здесь - это дБ <> скрипка.
Вот код:
WITH t as (
SELECT *
FROM (VALUES (1, NULL), (2, 1), (3, 1), (4, 2), (5, 3), (6, 8), (7, 9)
) v(id, parentId)
),
CTE AS (
SELECT Id, ParentId
FROM t
WHERE ParentId IS NULL
UNION ALL
SELECT t.Id, t.ParentId
FROM t
INNER JOIN CTE c ON t.ParentId = c.Id
)
SELECT *
FROM CTE;
Если вы получаете дубликаты в вашем фактическом наборе результатов, то, вероятно, у вас есть дубликаты в вашеморигинальный стол.Я бы рекомендовал удалить их перед выполнением рекурсивной логики:
with t as (
select distinct id, parentid
from <your query>
),
. . .
Затем запустить рекурсивную логику.