SQL Server递归自联接

时间:2017-03-22 14:58:33

标签: sql sql-server recursion

我有一个简单的类别表,如下列:

  • 编号
  • 名称
  • 的ParentId

因此,无限数量的类别可以是一个类别的孩子。例如,以下层次结构:

enter image description here

我希望,在一个简单的查询中返回类别"商务笔记本电脑"还要返回一个包含所有父母,逗号分隔符或其他内容的列:

enter image description here

或者采取以下示例:

enter image description here

1 个答案:

答案 0 :(得分:9)

递归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

See online demo on rextester