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

Mic*_*hel 2 c# sql-server

我想创建一个“可选方法”(无论它是视图还是函数,存储过程或其他东西,我都不知道是否还有其他方法)来获取所有直接父母和所有孩子,自孙表中的,孙,孙代等记录。我想从C#(.NET)调用的“可选方法”

我们有一个名为的表entities,它(除其他外)具有一个属性parentId,该属性引用Identities表的字段。通过这种方式,我们可以对实体树进行建模(在我们的案例中是建筑物,思想屋,地板,房间等的元素)

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

子节点可以可视化地“展开”。

如果必须在两个单独的语句中进行选择就可以了。

在C#中,我知道如何执行此操作,但是我不想向数据库发出大量请求,并且我认为Sql Server本身可以快速执行此操作,但我不知道如何:-)

Iro*_*eek 5

尝试使用以下递归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
Run Code Online (Sandbox Code Playgroud)

如果需要传递参数,则可以将CTEa VIEW或a 放在其中。Stored Procedure