我需要在 SQL Server 2005 上实现一个多父树(或有向图)。我已经阅读了几篇文章,但其中大多数都使用具有唯一根的单父树,如下所示。
-My PC
-Drive C
-Documents and Settings
-Program Files
-Adobe
-Microsoft
-Folder X
-Drive D
-Folder Y
-Folder Z
在这一个中,一切都来自一个根元素(我的电脑)。
就我而言,一个孩子可能有多个父母,如下所示:
G A
\ /
B
/ \
X C
/ \
D E
\ /
F
所以我有以下代码:
create table #ObjectRelations
(
Id varchar(20),
NextId varchar(20)
)
insert into #ObjectRelations values ('G', 'B')
insert into #ObjectRelations values ('A', 'B')
insert into #ObjectRelations values ('B', 'C')
insert into #ObjectRelations values ('B', 'X')
insert into #ObjectRelations values ('C', 'E')
insert into #ObjectRelations values ('C', 'D')
insert into #ObjectRelations values ('E', 'F')
insert into #ObjectRelations values ('D', 'F')
declare @id varchar(20)
set @id = 'A';
WITH Objects (Id, NextId) AS
( -- This is the 'Anchor' or starting point of the recursive query
SELECT rel.Id,
rel.NextId
FROM #ObjectRelations rel
WHERE rel.Id = @id
UNION ALL -- This is the recursive portion of the query
SELECT rel.Id,
rel.NextId
FROM #ObjectRelations rel
INNER JOIN Objects -- Note the reference to CTE table name (Recursive Join)
ON rel.Id = Objects.NextId
)
SELECT o.*
FROM Objects o
drop table #ObjectRelations
它返回以下 SET:
Id NextId
-------------------- --------------------
A B
B C
B X
C E
C D
D F
E F
预期结果集:
Id NextId
-------------------- --------------------
G B
A B
B C
B X
C E
C D
D F
E F
请注意,缺少 G->B 关系,因为它要求一个起始对象(这对我也不起作用,因为我从一开始就不知道根对象)并且使用 A 作为起点将忽略G->B 关系。
因此,此代码在我的情况下不起作用,因为它要求一个起始对象,这在单父树中很明显(将始终是根对象)。但是在多父树中,您可能有多个“根”对象(如在示例中,G 和 A 是“根”对象,其中根是没有父对象(祖先)的对象)。
所以我有点卡在这里......我需要修改查询以不要求起始对象并递归遍历整个树。我不知道 (Id, NextId) 实现是否有可能...可能我需要使用某种发生矩阵、邻接矩阵或其他任何东西将它存储为图形(请参阅http://willets.org/ sqlgraphs.html)。
有什么帮助吗?你们觉得怎么样?非常感谢您的宝贵时间 =)
干杯!