首页 > 解决方案 > 如何在 SQL Server 中的层次表上连接父子行?

问题描述

我有一个表地址,我想连接诸如 parent-1 => parent-1/all-child、parent-2 => parent-2/all-child 等行......

地址表

ID   Caption   Parent
---------------------
1    A          NULL
2    B          NULL
3    a          1
4    b          2
5    bb         4
6    C          NULL
7    aa         3
8    c          6

NULL Parent 是指 Root

期望的输出

ID   Caption   Parent
---------------------
1    A          NULL
3    A/a        1
7    A/a/aa     3
2    B          NULL
4    B/b        2
5    B/b/bb     4
6    C          NULL
8    C/c        6

标签: sqlsql-servertsqlrecursive-queryhierarchical-query

解决方案


您可以为此使用递归 cte。这个想法是从根节点开始,遍历层次结构到叶子,边走边连接路径。

with cte as (
    select id, cast(caption as nvarchar(max)) caption, parent from mytable where parent is null
    union all 
    select t.id, cast(c.caption + '/' + t.caption as nvarchar(max)), t.parent
    from cte c
    inner join mytable t on t.parent = c.id
)
select * from cte order by caption

DB Fiddle 上的演示

编号 | 标题 | 父母
:- | :-------- | -----:
1 | 一个 |   空值
3 | 一个/一个 | 1
7 | 一个/一个/一个 | 3
2 | 乙|   空值
4 | 早/晚 | 2
5 | B/b/bb | 4
6 | C |   空值
8 | 抄送| 6

推荐阅读