2017-03-22 68 views
2

我有一个简单的分类表与下面的列:SQL服务器递归自加入

  • 编号
  • 名称
  • 的ParentId

因此,分类无限量能一个类别的孩子。举个例子以下层次:

enter image description here

我想,在返回类别“商用笔记本电脑”也返回了所有列一个简单的查询,它的父母,逗号分隔或某事:

enter image description here

或者采取下面的例子:

enter image description here

+0

看一看:http://dba.stackexchange.com/questions/160924/can-i-get-a-tree-structure-from-a-self-参考层次表 – McNets

+0

一个重要的澄清问题:一个类别总是只有一个父类? –

+0

@LaughingVergil:永远不会有一个以上的直接父母,但也可能没有父母。 – Carel

回答

7

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

热膨胀系数:

;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

+0

不应该查询为'SELECT ID,名称,路径FROM CTE'? –

+0

@MihaiOvidiuDrăgoi正确,我玩过它,忘了删除'as'。现在修好。 –

+0

@ZoharPeled:真棒。我并不期待这样一个完整的答案。我将来肯定会包含样本数据。以下是查询我的一些实际数据:[l​​ink](http://rextester.com/EXS36784) – Carel