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

本文关键字:孙辈 子代 自引用 获取 | 更新日期: 2023-09-27 18:11:20

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

我们有一个名为entities的表,它(除其他外)有一个属性parentId,它指的是entities表的Id字段。通过这种方式,我们为实体树建模(在我们的例子中是建筑物的元素,比如房子、地板、房间等)

如果可视化的话,父节点就是那些与根元素形成直线的节点。

孩子……如果可视化的话,节点可以"展开"。

如果选择必须在两个单独的语句中完成,则可以。

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

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

尝试使用以下递归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