У меня есть какая-то древовидная структура, подобная этой
Некоторые узлы в дереве будут отключены. Дочерние узлы отключенных узлов должны быть подключены к родительскому узлу отключенного узла. Если этот отключен для следующего родителя и т. Д.
На этом рисунке узел 2 отключен, и узлы 4 и 5 подключаются к родителю узла 2, который является узлом 1
Это будет результат
Более сложный идентификатор случая, гдеродитель отключенного узла также отключен
В этом примере я получаю все дочерние узлы некоторых тестовых данныхно я понятия не имею, можно ли отбросить отключенные узлы, но оставить дочерние узлы подключенными к следующему возможному родителю
CREATE TABLE #Node
(
Id INT,
ParentID INT,
Name NVARCHAR(20),
skipNode BIT
);
INSERT INTO #Node
VALUES (1, NULL, 'node-1', 0),
(2, 1, 'node-2', 1),
(3, 1, 'node-3', 0),
(4, 2, 'node-4', 0),
(5, 2, 'node-5', 0),
(6, 3, 'node-6', 0),
(7, 4, 'node-6', 0),
(8, 4, 'node-6', 0);
WITH RCTE AS
(
SELECT
anchor.Id AS ItemId,
skipNode,
anchor.ParentId AS ItemParentId,
1 AS Lvl,
anchor.[Name],
CAST(name AS VARCHAR(1000)) AS NodePath
FROM
#Node anchor
WHERE
anchor.[Id] = 1
UNION ALL
SELECT
nextDepth.Id AS ItemId,
nextDepth.skipNode,
nextDepth.ParentId AS ItemParentId,
Lvl+1 AS Lvl,
nextDepth.[Name],
CAST((rec.NodePath + '/' + nextDepth.[Name]) AS VARCHAR(1000)) AS NodePath
FROM
#Node nextDepth
INNER JOIN
RCTE rec ON nextDepth.ParentId = rec.ItemId
)
SELECT ItemId, skipNode , ItemParentId, [Name], NodePath
FROM RCTE AS hierarchy
DROP TABLE #Node
Ожидаемый результат с отключенным узлом 2 будет
ItemId skipNode ItemParentId Name
----------- -------- ------------ -------
1 0 NULL node-1
3 0 1 node-3
6 0 3 node-6
4 0 1 node-4
5 0 1 node-5
7 0 4 node-6
8 0 4 node-6