从自引用表中获取所有子项(子项,孙项)和父项

时间:2014-07-04 08:01:25

标签: c# sql-server

我想创建一个可选择的方法' (无论是视图,功能还是存储过程或其他什么都不重要,我不知道是否有其他方法)让所有直接父母和所有子女,孙子孙女,来自自引用表的孙子等记录。 可选择的方法'我想从C#(.NET)

打电话

我们有一个名为entities的表,它有(其中包括)属性parentId,它引用Id表的entities字段。通过这种方式,我们模拟实体树(在我们的例子中,建筑物的元素,想想房子,地板,房间等)。

父节点(如果可视化)是形成到根元素的直接线的节点。

孩子......节点可以,如果可视化,可以展开'。

如果选择必须在两个单独的陈述中完成,那就没问题了。

在C#中,我知道如何做到这一点,但我不想向数据库发出大量请求,我认为Sql Server可以快速(呃)自己做,但我不是知道如何: - )

1 个答案:

答案 0 :(得分:4)

尝试使用以下递归CTE作为解决方案的基础:

WITH TREE AS (
  SELECT     ROOT.Id        
            ,ROOT.ParentId  
            ,ROOT.Prop1
            ,ROOT.Prop2 
            ...
            ,ROOT.PropN                 
            ,1 AS Level 
  FROM       ENTITIES ROOT      
  -- list entities starting from ROOT node (no ParentId)
  WHERE      ROOT.ParentId IS NULL 
  -- or list entities starting from a specified node
  -- WHERE ROOT.Id = @entityId

  UNION ALL

  SELECT     CHILD.Id
            ,CHILD.ParentId 
            ,CHILD.Prop1
            ,CHILD.Prop2    
            ...
            ,CHILD.PropN                
            ,PARENT.Level + 1
  FROM       ENTITIES CHILD INNER JOIN 
             TREE PARENT ON CHILD.ParentId = PARENT.Id
  WHERE      CHILD.ParentId IS NOT NULL
)

SELECT *  FROM TREE

如果您需要传递参数,可以将CTE置于VIEWStored Procedure内。