2017-03-01 60 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個關卡中,編寫這些連接條款的工作量非常大 –