父子关系的SQL查询

父子关系的SQL查询,sql,sql-server-2005,hierarchical-data,Sql,Sql Server 2005,Hierarchical Data,我有一个具有父子关系的db表,如下所示: NodeId NodeName ParentId ------------------------------ 1 Node1 0 2 Node2 0 3 Node3 1 4 Node4 1 5 Node5 3 6 Node6 5 7 Node7 2

我有一个具有父子关系的db表,如下所示:

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查询,它将返回父类别所有级别的子级

e、 g.对于nodeId=1,它应该返回3、4、5、6


我使用的是MS SQL Server 2005

您应该研究在SQL数据库中使用嵌套集模型来处理父子关系。这比像这样在表中存储记录的parentID要好得多,并且使这样的查询更容易

为了确保如果它是它自己的父级,那么它可以工作(否则它将递归,直到它崩溃):

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]
,其中[CTE]为(
从[TheTable]c中选择*其中c.[ParentId]=1
联合所有
从[CTE]p[TheTable]c中选择*其中c.[ParentId]=p.[NodeId]
和c.[ParentId]c.[NodeId]
)
从[CTE]中选择*

我建议添加最大递归提示。
   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]
 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