SQL服务器:构建有效树过滤无效分支

SQL Server : build valid tree filtering invalid branches

我有一个 table,其中包含以下数据:

ID     ParentID    Name
-----------------------
 1       NULL      OK1
 2        1        OK2
 3        2        OK3
 5        4        BAD1
 6        5        BAD2

所以我只需要取那些被 linked 到 ParentID = NULL 或这些行的有效子行的行(即:OK3 是有效的,因为它被 linked 到 OK2 ,linked 为 OK1,linked 为 NULL,这是有效的。)

但是 BAD1 和 BAD 2 无效,因为它们没有 linked 到一行,而这行 linked 为 NULL。

我想出的最佳解决方案是过程 + 函数。并且函数被调用的次数与 table 中的最大 link 级别数一样多。

任何人都可以为此类任务提出更好的解决方案吗?

你所需要的只是爱和基本的recursive CTE :-)

创建并填充样本数据(在以后的问题中为我们省去这一步):

DECLARE @T as table
(
    ID int,
    ParentID int,
    Name varchar(4)
)

INSERT INTO @T VALUES
(1, NULL, 'OK1'),
(2, 1, 'OK2'),
(3, 2, 'OK3'),
(5, 4, 'BAD1'),
(6, 5, 'BAD2')

CTE 和查询:

;WITH CTE AS
(
    SELECT ID, ParentId, Name
    FROM @T 
    WHERE ParentId IS NULL

    UNION ALL

    SELECT T1.ID, T1.ParentId, T1.Name
    FROM @T T1
    INNER JOIN CTE T2 ON T1.ParentID = T2.ID
)

SELECT *
FROM CTE 

结果:

ID          ParentId    Name
----------- ----------- ----
1           NULL        OK1
2           1           OK2
3           2           OK3