首页 > 解决方案 > T-SQL 员工层次递归查询

问题描述

我想使用 T-SQL 查询(它可以是递归 CTE 或任何东西),我可以在其中获得以下突出显示的输出

SQL 创建示例表如下

--drop table #hierarchy
CREATE TABLE #hierarchy
(
    ID INTEGER NOT NULL PRIMARY KEY,
    Value CHAR(10) NOT NULL,
);

INSERT INTO #hierarchy
VALUES (1, 'a1'), (2, 'b2'), (3, 'c3'), (4, 'd4'),
       (5, 'e5'), (6, 'f6'), (7, 'g7'), (8, 'h8');

在此处输入图像描述

欢迎提出任何建议,尝试了类似于阶乘操作的递归 cte,但希望输入。

提前致谢。

标签: sqlsql-servertsql

解决方案


您似乎正在寻找字符串连接:

select
    id,
    value,
    (
        select string_agg(trim(value), '->') within group(order by id)
        from #hierarchy h1
        where h1.id <= h.id
    ) path
from #hierarchy h

DB Fiddle 上的演示

编号 | 价值 | 小路
-: | :--------- | :---------------------------- 1 | a1 | a1
2 | b2 | a1->b2
3 | c3 | a1->b2->c3
4 | d4 | a1->b2->c3->d4
5 | e5 | a1->b2->c3->d4->e5
6 | f6 | a1->b2->c3->d4->e5->f6
7 | g7 | a1->b2->c3->d4->e5->f6->g7
8 | h8 | a1->b2->c3->d4->e5->f6->g7->h8

在不支持 `string_agg() 的 SQL Server 版本中,您可以:

select
    id,
    value,
    stuff(
        (
            select distinct '->' + trim(h1.value) val
            from #hierarchy h1
            where h1.id <= h.id
            order by val
            for xml path(''), type
        ).value('.', 'nvarchar(max)')
        , 1, 2, ''
    ) path
from #hierarchy h

演示


推荐阅读