13

我有父子关系的数据库表:

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

例如,对于 nodeId = 1,它应该返回 3、4、5、6。

我正在使用 MS SQL Server 2005

4

4 回答 4

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]
于 2008-10-16T03:17:39.533 回答
6

您应该考虑将嵌套集模型用于 SQL 数据库中的父子关系。这比尝试将记录的 parentID 存储在这样的表中要好得多,并且使这样的查询更容易。

于 2008-11-17T13:56:32.987 回答
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]
于 2009-05-06T06:45:19.143 回答
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
于 2011-01-20T07:52:06.537 回答