当前位置: 首页 > 面试题库 >

使用oracle connect by查找邻接表模型中的所有节点

吴英武
2023-03-14
问题内容

给定以下模型:

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开始的工作。

很久以前,我回答了一个关于在层次结构中展平节点的问题(即传递闭包),即如果1->2->3为true,则“ 1->
3”也为true。它链接到一篇论文,该论文演示了PL /
SQL解决方案以生成所有边缘并将它们存储在表中。在这种情况下,可以使用类似的解决方案。但是很明显,只有图中的节点不经常更改才是可行的。因此,也许只有有限的用途。



 类似资料:
  • 我不知道该如何解决这个问题。我得到了一个有12个节点A-L的图。17个边缘连接它们。我被告知要找到从A到L的所有路径。我可以遍历一个节点多次,但只能遍历一次边。输出应该打印每个路径和路径总数。 例如,如果只有1个路径。输出应为: 我想一个递归的深度优先搜索函数应该可以解决这个问题,但我就是想不出一个打印每一条路径的方法。例如,如果我的函数找到一个路径ABDL并到达结尾L,它将打印ABDL。然后它回

  • 假设我有以下XML文档: 使用REST assured的我想阅读所有

  • 我有一个表,它有和列:我把这个结构称为邻接列表<所以,现在我想得到任意id的所有子项。这个问题的经典解决方案是使用递归,例如这里是Postgres过程或CTE实现。 我目前正在使用Spring Webflux和Spring Data R2DBC Postgres R2DBC驱动程序(它还不支持存储过程)<我如何以被动的方式处理这个问题?有没有可能,或者我遗漏了一些概念上的错误? UPD 1: 现在

  • 作为一项练习,我必须建立一个卫星导航系统,规划从一个位置到另一个位置的最短和最快路线。它必须尽可能快,而不需要使用太多内存。 我很难决定使用哪种结构来表示图形。我知道矩阵更适合密集图,列表更适合稀疏图。我更倾向于使用列表,因为我认为添加顶点将是这个程序中最累人的部分。 我只是想听听你们的意见。如果我把一个典型的路线图看作一个图形,其中不同的位置是节点,道路是边缘。你认为它是稀疏的还是密集的?在这种

  • 我知道总是打印第一次出现的索引。我如何打印所有的索引?

  • 问题内容: 我可以这样做: 但是,鉴于使用XPath可以简单地查询并完成它的事实,这似乎是微不足道的。 在IE9 +,Safari5 +,Chrome19+,Firefox12+,Opera11+上运行的HTML文档中,在特定元素下获取所有文本节点的最简单方法是什么? “最简单”被粗略地定义为“高效而又短,没有打高尔夫球”。 问题答案: 根据@kennebec的回答,该逻辑的实现略为严格: 但是,