据我了解,如果您将一个部分定义为父级,另一个定义为子级,则任何多对多关系都是一种层次结构。
我有一种情况,我需要在多对多表中获取映射到自身的对象的子对象,但是我很难为它编写递归 CTE。
例如,假设我有:
ParentId ChildId
======== =======
2 20
2 30
5 50
20 200
21 201
30 300
31 301
对于根级别,我使用的规则是它是一个根对象,如果它的 ID 不在第二列 (ChildId) 中,但这是有问题的,因为从上面的示例可以看出,我可以有多个记录根(ID:2)
对于递归部分,无论我尝试什么,要么得到无限递归,要么递归根本不起作用。
所以我完全被卡住了。
更新 只是添加更多说明。我正在构建一个存储过程,该过程在 parentId 中传递,并且内部具有递归 CTE。我想要得到的输出是,对于传入 2 的 parentId,使用上面的示例,我想:
ParentId ChildId Level
======== ======= =====
2 20 0
2 30 0
20 200 1
30 300 1
这是我的一些代码:
alter procedure [dbo].[FindChildren]
@Id bigint
as
begin
;with DocumentHierarchyCTE (ParentId, ChildId, LevelNumber)
as
(
select
th.ParentDocumentId as ParentId,
th.ChildDocumentId as ChildId,
0 as LevelNumber
from dbo.DocumentHierarchy th
where
th.ParentDocumentId = @Id
and not exists(select 1 from dbo.DocumentHierarchy tz where tz.ChildDocumentId = th.ParentDocumentId )
union all
???
)
select *
from DocumentHierarchyCTE d
option (maxrecursion 0)
end
go