2008-10-16 76 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