sql server递归自联接

rks48beu  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(344)

我有一个简单的categories表,包含以下列:
身份证件
名称
父节点
所以,无穷多的范畴可以是一个范畴的子范畴。以以下层次结构为例:

我想,在一个返回类别“business laptops”的简单查询中,也返回一个包含所有父项、逗号分隔符或其他内容的列:

或者举下面的例子:

6rvt4ljy

6rvt4ljy1#

把cte送去救援。。。。
创建并填充示例表(请在以后的问题中保存此步骤):

DECLARE @T as table
(
    id int,
    name varchar(100),
    parent_id int
)

INSERT INTO @T VALUES
(1, 'A', NULL),
(2, 'A.1', 1),
(3, 'A.2', 1),
(4, 'A.1.1', 2),
(5, 'B', NULL),
(6, 'B.1', 5),
(7, 'B.1.1', 6),
(8, 'B.2', 5),
(9, 'A.1.1.1', 4),
(10, 'A.1.1.2', 4)

cte:

;WITH CTE AS
(
    SELECT id, name, name as path, parent_id
    FROM @T 
    WHERE parent_id IS NULL
    UNION ALL
    SELECT t.id, t.name, cast(cte.path +','+ t.name as varchar(100)), t.parent_id
    FROM @T t
    INNER JOIN CTE ON t.parent_id = CTE.id
)

查询:

SELECT id, name, path
FROM CTE

结果:

id      name        path
1       A           A
5       B           B
6       B.1         B,B.1
8       B.2         B,B.2
7       B.1.1       B,B.1,B.1.1
2       A.1         A,A.1
3       A.2         A,A.2
4       A.1.1       A,A.1,A.1.1
9       A.1.1.1     A,A.1,A.1.1,A.1.1.1
10      A.1.1.2     A,A.1,A.1.1,A.1.1.2

请参阅rextester上的在线演示

相关问题