【问题标题】:SQL Server : build valid tree filtering invalid branchesSQL Server:构建有效树过滤无效分支
【发布时间】:2016-07-03 19:36:14
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

标签: sql sql-server tree


【解决方案1】:

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

【讨论】:

  • 这个加1(请在以后的问题中保存我们这一步) ;)
  • @Prdp 谢谢。这是我的答案的最新补充。我发现人们倾向于更好地满足这个要求,而不是在 cmets 中问他们“请编辑你的问题以包括相关的表格 ddl ...”我一直在写。我希望这种趋势能够流行起来,以便我们看到更多格式正确的问题。
猜你喜欢
  • 2016-10-09
  • 2017-07-29
  • 2022-01-07
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多