我的数据库包含以树状结构(父子关系)关联的对象,但是对象可以具有多个父对象(因此它实际上不是树,而是图)。
我想从给定的起始对象遍历图,并列出起始对象中所有相关的对象。
我的桌子看起来像这样:
我的递归查询应该访问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:对不起,如果已经有人问过我,我没有找到解决方法。