【问题标题】:SQL Query for Parent Child Relationship父子关系SQL查询
【发布时间】:2008-10-16 03:08:34
【问题描述】:

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

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

【问题讨论】:

    标签: sql sql-server-2005 hierarchical-data


    【解决方案1】:
    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]
    

    【讨论】:

    • 我建议添加最大递归提示。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      并且只是为了确保它在它自己的父级时工作(否则它将递归直到它中断):

         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]
      

      【讨论】:

        【解决方案4】:
         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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-27
          • 1970-01-01
          相关资源
          最近更新 更多