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
我有一个 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