递归SQL连接

时间:2017-03-01 10:50:39

标签: sql join powerpivot

我有一个表,想要递归地连接这个表以获得层次结构。所以这就是表格的样子:

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获取结果表的简单解决方案,它也会对我有很大帮助:)

谢谢

1 个答案:

答案 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