如何在遍历图的递归cte查询中记住节点?

时间:2020-07-01 11:23:51

标签: sql recursion ssms common-table-expression

我的数据库包含以树状结构(父子关系)关联的对象,但是对象可以具有多个父对象(因此它实际上不是树,而是图)。

我想从给定的起始对象遍历图,并列出起始对象中所有相关的对象。

我的桌子看起来像这样:

table and graph

我的递归查询应该访问Node的所有父代和所有子代,然后从那里重复。问题是我不知道该如何记住已经去过的节点,因此我陷入了无尽的递归。

这是我写的查询(它不记得访问过的节点):

With cte_Relatives(ident, parentIdent) 
AS (
SELECT start.ident, start.parentIdent
FROM tblRelatives start
WHERE start.Ident = 'C'

UNION ALL

SELECT  
        child.ident, 
        child.parentIdent, 
FROM tblRelatives AS child
JOIN cte_Relatives parent ON parent.ident = child.parentIdent

UNION ALL

SELECT 
    parent.ident,
    parent.parentIdent,
FROM tblRelatives AS parent
JOIN cte_Relatives child ON parent.ident = child.parentIdent


)

SELECT * FROM cte_Relatives

我的问题是ctes不允许每个联合块对cte_Recursion进行多个递归引用。因此,我无法查看我的新表是否已包含该ID。像这样:

JOIN cte_Relatives child ON parent.ident = child.parentIdent AND parent.ident not in (Select ident from cte_Relatives) 

如何存储访问的节点?

P.s:对不起,如果已经有人问过我,我没有找到解决方法。

0 个答案:

没有答案