与另一个表有1:n关系的递归SQL

时间:2018-03-20 15:47:32

标签: sql tsql

我有一个令我头痛的问题:

我们使用T-SQL(MS SQL-Server)。 我在一张桌子上有一个衣衫褴褛的父母/子女的层次结构。具有父/子关系(T1)的表中的每一行在另一个表(T2)中具有多个值。 我的目标是从表T2中获取表T1的每一行的值,包括它的那些行的前辈。

以下是一个例子:

T1有一个参差不齐的父子层次结构。

     ClassID            |     ParentclassID     
    ____________________|___________________________
    1                   |     NULL              
    --------------------|---------------------------
    2                   |     1
    --------------------|---------------------------
    3                   |     2
     -------------------|---------------------------
    4                   |     1

T2表格T1

中的每个值都有多个值
       ClassID          |       FeatureID       
    ____________________|___________________________
    1                   |      A                
    --------------------|---------------------------
    1                   |      B
    --------------------|---------------------------
    2                   |      C
    --------------------|---------------------------
    2                   |      D
    --------------------|---------------------------
    3                   |      E       
    --------------------|---------------------------
    4                   |      F     

我的目标是以下输出:

    ClassID             |       FeatureID       
    ____________________|___________________________
    1                   |      A                
    --------------------|---------------------------
    1                   |      B
    --------------------|---------------------------
    2                   |      A
    --------------------|---------------------------
    2                   |      B
    --------------------|---------------------------        
    2                   |      C
    --------------------|---------------------------
    2                   |      D
    --------------------|---------------------------
    3                   |      A
    --------------------|---------------------------
    3                   |      B
    --------------------|---------------------------        
    3                   |      C
    --------------------|---------------------------
    3                   |      D
    --------------------|---------------------------        
    3                   |      E       
    --------------------|---------------------------
    4                   |      A     
    --------------------|---------------------------
    4                   |      B     
    --------------------|---------------------------
    4                   |      F     

如果它只是一个粗糙的层次结构,我可以通过递归cte来解决这个问题。但它是导致问题的表T2的1:n关系。

任何建议都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

加入树

declare @H table (id int primary key, par int);
insert into @H values 
       (1, NULL)              
     , (2, 1)
     , (3, 2)
     , (4, 1);
DECLARE @Feature AS TABLE
(
    ClassID int,
    FeatureID char(1)
)
INSERT INTO @Feature (ClassID, FeatureID) VALUES
(1, 'A'), (1, 'B'),
(2, 'C'), (2, 'D'),
(3, 'E'), 
(4, 'F'),
(5, 'G');
with cte as 
(  select h.id,   h.par,   h.id as tree 
   from @H h
   union all 
   select cte.id, cte.par, h.par
   from cte 
   join @H H 
     on cte.tree = h.id
)
select * from cte 
join @Feature f 
  on f.ClassID = cte.tree
where cte.tree is not null
order by cte.id, cte.par, cte.tree