我有一个令我头痛的问题:
我们使用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关系。
任何建议都将受到高度赞赏。
答案 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