2012-11-12 33 views
1

我有一個表通過兩個字段存儲遞歸記錄:ID和PARENTID。如何從CTE的分層視圖獲取元素

我有一個功能,可以將父項關聯到樹的一個元素。當我選擇可以成爲我自己的「父母」的元素時,我顯然會從結果列表中排除所有直接或間接依賴於我的元素,而且還包括我已經依賴的元素。

讓我們來舉個例子。考慮下面的示例層次:

ID     PARENT_ID 
-----------   ------------------ 
1     NULL 
2     1 
3     NULL 
4     2 
5     1 
6     3 

如果我想找到可以與ID = 4元素的父我只考慮元素5 - 3 - 6,因爲他們沒有與實際結構的任何關係的元素。

我怎樣才能得到這些與CTE查詢元素?

+0

你是怎麼得到5-3-6的?我會得到2 - 1 – bummi

+0

5/3/6與4沒有直接關係,也沒有間接關係。2已經是4的父親,並且1是它的祖先... – Lorenzo

+0

目的是特定於應用程序。任何元素都可以有任何父項,但每個父項只能出現一次.... – Lorenzo

回答

1
Select * 
into #tmp 
From Tree2 

;WITH Rollups AS (
    SELECT ID, Parent_Id 
    FROM tree2 where ID=4 
    UNION ALL 
    SELECT parent.Id, parent.Parent_Id 
    FROM tree2 parent 
    INNER JOIN Rollups child ON child.Id = parent.Parent_Id 
) 
Delete #tmp from Rollups where #tmp.ID=Rollups.ID 

;WITH Rollups AS (
    SELECT ID, Parent_Id 
    FROM tree2 where ID=4 
    UNION ALL 
    SELECT parent.Id, parent.Parent_Id 
    FROM tree2 parent 
    INNER JOIN Rollups child ON child.Parent_Id = parent.Id 
) 
Delete #tmp from Rollups where #tmp.ID=Rollups.ID 

Select * from #tmp 
Drop Table #tmp