2008-10-16 78 views
13

我有分貝表作爲父子關係:SQL查詢爲父子關係

NodeId NodeName ParentId 
------------------------------ 
1   Node1  0 
2   Node2  0 
3   Node3  1 
4   Node4  1 
5   Node5  3 
6   Node6  5 
7   Node7  2 

這裏的parentId = 0意味着它是一個根級別節點。現在我想編寫一個SQL查詢,它將返回父類別的所有級別的子級。

例如爲節點ID = 1,它應該返回3,4,5,6

我使用MS SQL Server 2005的

回答

10
with [CTE] as (
    select * from [TheTable] c where c.[ParentId] = 1 
    union all 
    select * from [CTE] p, [TheTable] c where c.[ParentId] = p.[NodeId] 
) 
select * from [CTE] 
+1

我建議增加最大遞歸提示。 – 2008-10-16 05:10:51

6

你應該看看使用嵌套集合模型內的父子關係SQL數據庫。這比試圖像這樣在表中存儲記錄的parentID好得多,並且使得這樣的查詢更容易。

4

而只是爲了確保它正常工作,如果其自身的父(否則它會重複,直到它打破):

with [CTE] as (
     select * from [TheTable] c where c.[ParentId] = 1 
     union all 
     select * from [CTE] p, [TheTable] c where c.[ParentId] = p.[NodeId] 
     and c.[ParentId] <> c.[NodeId] 
    ) 
    select * from [CTE] 
1
WITH Temp_Menu AS 
( 
    SELECT AM.* from FCB_AccessMenu AM where AM.[ParentId] = 6 

      UNION ALL  

     SELECT AM.* FROM FCB_AccessMenu AM ,Temp_Menu TM WHERE AM.[ParentID]=TM.[MenuID]   

) 

    SELECT * FROM Temp_Menu ORDER BY ParentID