从自引用表中获取所有子项(子代、孙辈)和父代
本文关键字:孙辈 子代 自引用 获取 | 更新日期: 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
放在VIEW
或Stored Procedure
中。