我有一张包含以下数据的表格:
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。
我发现的最佳解决方案是程序+功能。并且函数被调用为表中链接级别的最大数量。
有人可以提出更好的解决方案吗?
答案 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