Код с моей попыткой
DECLARE @T TABLE
(
[Id] BIGINT
, [Value] NVARCHAR(MAX)
, [Parent_Id] BIGINT
) ;
INSERT @T
VALUES
( 1, N'A', NULL )
, ( 2, N'B', 1 )
, ( 3, N'C', 2 )
, ( 4, N'D', 1 )
, ( 5, N'E', NULL )
, ( 6, N'F', 5 )
, ( 7, N'G', 5 )
, ( 8, N'H', 7 ) ;
; WITH [CTE] AS
(
SELECT [Id]
, [Value]
, [Parent_Id]
, CAST ( [Value] AS NVARCHAR(MAX) ) AS [ValuePath]
FROM @T
--WHERE [Id] = 3
UNION ALL
SELECT [P].[Id]
, [P].[Value]
, [P].[Parent_Id]
, CAST ( CONCAT ( [C].[ValuePath], N' > ', [P].[Value] ) AS NVARCHAR(MAX) ) AS [ValuePath]
FROM @T AS [P]
JOIN [CTE] AS [C]
ON [P].[Parent_Id] = [C].[Id]
)
SELECT *
FROM [CTE]
ORDER BY [CTE].[Id]
OPTION ( MAXRECURSION 0 ) ;
Токовый выход
Id Value Parent_Id ValuePath
1 A NULL A
2 B 1 B
2 B 1 A > B
3 C 2 B > C
3 C 2 A > B > C
3 C 2 C
4 D 1 D
4 D 1 A > D
5 E NULL E
6 F 5 F
6 F 5 E > F
7 G 5 E > G
7 G 5 G
8 H 7 H
8 H 7 G > H
8 H 7 E > G > H
Требуемый выход при отсутствии фильтра
Id Value Parent_Id ValuePath
1 A NULL A
2 B 1 A > B
3 C 2 A > B > C
4 D 1 A > D
5 E NULL E
6 F 5 E > F
7 G 5 E > G
8 H 7 E > G > H
С фильтром (например, Id = 3)
Id Value Parent_Id ValuePath
3 C 2 A > B > C
Цель Получить путь к полю значения с разделителем «>».Может быть применен дополнительный фильтр Id.Я получаю все записи, но мне нужна только 1 запись для каждого идентификатора и его полного пути.Кроме того, производительность важна.Вы бы порекомендовали мне создать udf с фильтром?Пожалуйста, дайте мне знать, если вам нужно больше информации.Я