我想创建一个“可选方法”(不管是 View 、函数、存储过程还是其他东西,我不知道是否有其他方法)来获取所有直接 parent 和所有 child 、孙子、孙子等来自自引用表的记录。
我想从 C# (.NET) 调用的“可选方法”
我们有一个名为 entities
的表,它有(除其他外)一个属性 parentId
,它指的是 Id
表的 entities
字段。通过这种方式,我们对实体树进行建模(在我们的案例中为建筑物、房屋、楼层、房间等元素)
父节点(如果可视化)是与根元素形成直线的节点。
如果可视化,子节点可以“展开”。
如果选择必须在两个单独的语句中完成,那也没关系。
在 C# 中,我知道如何做到这一点,但我不想向数据库发出大量请求,我认为 Sql Server 可以自己快速(呃)做到这一点,但我不知道如何:-)
最佳答案
尝试使用以下递归 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
中。关于c# - 从自引用表中获取所有子项(子项、孙子项)和父项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24569451/