数据:
DECLARE @Data TABLE ([parent_id] INT, [child_id] INT) ;
INSERT INTO @Data
SELECT 1, 2
UNION
SELECT 1, 3
UNION
SELECT 2, 3
UNION
SELECT 3, 4
UNION
SELECT 5, 5
UNION
SELECT 6, 6
UNION
SELECT 6, 7
UNION
SELECT 28, 29
UNION
SELECT 28, 30
UNION
SELECT 31, 29
UNION
SELECT 31, 33
目标:根据该层次结构中的值查询根父级的整个树。
场景:
如果我选择查询 <_id> = 4(..或 1 ..或 2 ..或 3),查询应返回以下内容。
parent_id child_id
1 2
1 3
2 3
3 4
如果我选择查询 <_id> = 5,查询应返回以下内容。
parent_id child_id
5 5
如果我选择查询 <_id> = 7(..或 6),查询应返回以下内容。
parent_id child_id
6 6
6 7
如果我选择查询 <_id> = 28,查询应返回以下内容。
parent_id child_id
28 29
28 30
如果我选择查询 <_id> = 29,查询应返回以下内容。
parent_id child_id
28 29
28 30
31 29
32 33
我的尝试:要么不返回整个层次结构(@probe_id 4),要么返回重复(@probe_id = 2),要么不返回所有分支(@probe_id = 29),等等
DECLARE @probe_id INT = 4 ;
; WITH CTE AS
( SELECT [parent_id]
, [child_id]
FROM @Data
WHERE [parent_id] = @probe_id
OR [child_id] = @probe_id
UNION ALL
SELECT [T].[parent_id]
, [T].[child_id]
FROM @Data AS [T]
JOIN CTE AS [C]
ON [T].[parent_id] = [C].[child_id] )
SELECT [parent_id]
, [child_id]
FROM CTE
OPTION ( MAXRECURSION 0 ) ;