2016-11-16 88 views
1

我已经在这个格式找到所有成员在树结构

StatementAreaId | ParentStatementAreaId | SubjectId | Description 
----------------------------------------------------------------- 
1    | 0      | 100  | Reading 
2    | 0      | 110  | Maths 
3    | 2      | 0   | Number 
4    | 2      | 0   | Shape 
5    | 3      | 0   | Addition 
6    | 3      | 0   | Subtraction 

我想找到所有的StatementAreaIds在最终母公司主题是继承树型表,说数学(即SubjectId = 110)。举例来说,如果SubjectId是数学我会得到树StatementAreaIds的列表:

StatementAreaId 
--------------- 
2 
3 
4 
5 
6 

树的最大深度为3,如果没有什么帮助。

感谢

+0

预期输出应该是.. – Chanukya

+0

例如,如果SubjectId是数学,我会得到树中StatementAreaIds的列表,例如, 2,3,4,5,6 –

+0

请在你的问题中正确地发布要求.. – Chanukya

回答

2

递归CTE救援:

创建和填充示例表:(保存我们这一步在你未来的问题)

DECLARE @T AS TABLE 
(
    StatementAreaId int, 
    ParentStatementAreaId int, 
    SubjectId int, 
    Description varchar(20) 
) 

INSERT INTO @T VALUES 
(1    , 0      , 100  , 'Reading'), 
(2    , 0      , 110  , 'Maths'), 
(3    , 2      , 0   , 'Number'), 
(4    , 2      , 0   , 'Shape'), 
(5    , 3      , 0   , 'Addition'), 
(6    , 3      , 0   , 'Subtraction') 

查询:

;WITH CTE AS 
(
    SELECT StatementAreaId, ParentStatementAreaId 
    FROM @T 
    WHERE SubjectId = 110 

    UNION ALL 
    SELECT t1.StatementAreaId, t1.ParentStatementAreaId 
    FROM @T t1 
    INNER JOIN CTE ON t1.ParentStatementAreaId = CTE.StatementAreaId 
) 

SELECT StatementAreaId 
FROM CTE 

结果:

StatementAreaId 
2 
3 
4 
5 
6