【问题标题】:CTE to get all children and nested children of every parentCTE获取每个父母的所有孩子和嵌套孩子
【发布时间】:2021-07-04 00:28:12
【问题描述】:

我陷入了一个不断在脑海中寻找解决方案的问题。

我有一个有 6k 行的 users 表,它们与 parent-child 相关。问题是,我不仅希望在单个级别的父子关系中获得结果,而且还希望在所有级别(直到最后一个孩子)为每个 userid 获得结果。

我的users 表中有这些数据。

UserID | ParentID
1        NULL
2        1
3        1
4        2
5        2
6        5
7        6
8        6
9        NULL

我想要这个数据作为 CTE 的输出。

ParentID  |  UserID
1            1
1            2
1            3
1            4
1            5
1            6
1            7
1            8
2            2
2            4
2            5
2            6
2            7
2            8
3            3
4            4
5            5
5            6
5            7
5            8
6            6
6            7
6            8
7            7
8            8
9            9

注意:ParentID 不仅包括其子代,还包括其子代的子代和自身。我正在使用 MSSQL 2019。

【问题讨论】:

    标签: sql sql-server tsql common-table-expression sql-server-2019


    【解决方案1】:

    在 cte 的第一部分中,选择所有以 ownid 作为根 id 的行。然后在第二部分(全部联合之后)选择 parentid 作为 rootid。

    架构和插入语句:

     create table users (UserID int,  ParentID int);
     insert into users values (1,        NULL);
     insert into users values (2,        1);
     insert into users values (3,        1);
     insert into users values (4,        2);
     insert into users values (5,        2);
     insert into users values (6,        5);
     insert into users values (7,        6);
     insert into users values (8,        6);
     insert into users values (9,        NULL);
    

    查询:

     with cte as
     (
       select userid rootid, userid, parentid from users 
       union all
       select cte.rootid rootid, users.userid, users.parentid from users
       inner join cte on users.parentid=cte.userid
     )
     select rootid parentid,userid from cte
     order by rootid ,userid
     option (maxrecursion 0)
    

    输出:

    parentid userid
    1 1
    1 2
    1 3
    1 4
    1 5
    1 6
    1 7
    1 8
    2 2
    2 4
    2 5
    2 6
    2 7
    2 8
    3 3
    4 4
    5 5
    5 6
    5 7
    5 8
    6 6
    6 7
    6 8
    7 7
    8 8
    9 9

    dbhere

    【讨论】:

      猜你喜欢
      • 2013-11-23
      • 2018-01-29
      • 1970-01-01
      • 2018-01-15
      • 2022-01-15
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多