SQL Server:构建有效的树过滤无效分支

时间:2016-07-03 10:38:52

标签: sql sql-server tree

我有一张包含以下数据的表格:

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

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

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

我发现的最佳解决方案是程序+功能。并且函数被调用为表中链接级别的最大数量。

有人可以提出更好的解决方案吗?

1 个答案:

答案 0 :(得分:2)

所有你需要的是爱,以及基本的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