我想创建一个可选择的方法' (无论是视图,功能还是存储过程或其他什么都不重要,我不知道是否有其他方法)让所有直接父母和所有子女,孙子孙女,来自自引用表的孙子等记录。 可选择的方法'我想从C#(.NET)
打电话我们有一个名为entities
的表,它有(其中包括)属性parentId
,它引用Id
表的entities
字段。通过这种方式,我们模拟实体树(在我们的例子中,建筑物的元素,想想房子,地板,房间等)。
父节点(如果可视化)是形成到根元素的直接线的节点。
孩子......节点可以,如果可视化,可以展开'。
如果选择必须在两个单独的陈述中完成,那就没问题了。
在C#中,我知道如何做到这一点,但我不想向数据库发出大量请求,我认为Sql Server可以快速(呃)自己做,但我不是知道如何: - )
答案 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
置于VIEW
或Stored Procedure
内。