2017-03-01 67 views
1

我有一个表,并希望以递归方式将此表与自己连接以获取层次结构。所以,这是表的外观:递归SQL连接

IDParent | IDChild | Level | Value 
---------------------------------- 
1  |  2  | 0 | 500 
2  |  3  | 1 | 700 
3  |  4  | 2 | 900 
...   ...  ... 

,这是它看起来应该像:

IDLvl0 | IDLvl1 | ValueLvl1 | IDLevel2 | ValueLvl2 ... 
------------------------------------------------------ 
1  | 2 | 500 |  3 | 700 ... 

的首选结果表应与PowerPivot的使用,所以如果你知道一个简单的解决方案,使与MDX或PowerPivot的结果表中它也将帮助我很多:)

谢谢

+0

您正在使用哪个数据库管理系统? –

回答

1

简单的解决方案:

HierarchyINNER JOIN本身与ON T1.IDChild = T2.IDParent条款。 使用尽可能多的INNER JOIN Hierarchy T2 ON T1.IDChild = T2.IDParent子句,因为您需要获取更多层次结构级别。

CREATE TABLE Hierarchy (IDParent int, IDChild int, Level int, Value int); 
INSERT Hierarchy VALUES (1,2,0,500),(2,3,1,700),(3,4,2,900); 

SELECT T1.IDChild, T1.IDParent, T2.IDChild, T2.IDParent, T3.IDChild, T3.IDParent 
FROM Hierarchy T1 
     INNER JOIN Hierarchy T2 ON T1.IDChild = T2.IDParent 
     INNER JOIN Hierarchy T3 ON T2.IDChild = T3.IDParent 

SELF INNER JOIN Result

CTE(公共表表达式)解决方案: 锚段将得到树的根和递归成员定义将得到所有其他记录。

WITH CTE (IDParent, IDChild, [Level], Value, LVL) 
AS 
(
-- Anchor member definition 
    SELECT IDParent, IDChild, [Level], Value, 0 as LVL 
    FROM Hierarchy AS h 
    WHERE h.IDParent = 1 
    UNION ALL 
-- Recursive member definition : will help us calculate true on-the-fly recursive hierarchy levels 
    SELECT h.IDParent, h.IDChild, h.[Level], h.Value, LVL + 1 
    FROM Hierarchy AS h 
    INNER JOIN CTE 
     ON h.IDParent = CTE.IDChild 
    where (h.IDChild <> 1) 
) 
select * from CTE 

Recursive CTE Result

+0

是的简单的解决方案是它应该是什么样子。但是有没有解决方案可以自动执行此操作?所以当你有例如在30个关卡中,编写这些连接条款的工作量非常大 –