根据父/子值查询整个层次结构

问题描述 投票:0回答:0

数据

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 ) ;
sql sql-server tsql sql-server-2016 hierarchy
© www.soinside.com 2019 - 2024. All rights reserved.