给定以下模型:
create table child_parent ( child number(3), parent number(3) );
给定以下数据:
insert into child_parent values(2,1); insert into child_parent values(3,1); insert into child_parent values(4,2); insert into child_parent values(5,2); insert into child_parent values(6,3);
产生以下树:
1 / \ 2 3 / \ \ 4 5 6
现在我可以找到5个这样的父母:
SELECT parent FROM child_parent START WITH child = 5 CONNECT BY NOCYCLE PRIOR parent = child;
但是如何从5开始获取所有节点(1,2,3,4,5,6)?
Oracle的CONNECT BY语法旨在遍历分层数据:它是单向的,因此不适合表示需要双向性的图。无法2 -> 1 -> 3进行一个查询,这是使所有节点从5开始的工作。
2 -> 1 -> 3
很久以前,我回答了一个关于在层次结构中展平节点的问题(即传递闭包),即如果1->2->3为true,则“ 1-> 3”也为true。它链接到一篇论文,该论文演示了PL / SQL解决方案以生成所有边缘并将它们存储在表中。在这种情况下,可以使用类似的解决方案。但是很明显,只有图中的节点不经常更改才是可行的。因此,也许只有有限的用途。
1->2->3