首先简要描述我的问题
我有一个包含可能在这个伪有向图中表示的数据的表: 我说它是一个伪图,因为我有一些“边”,它们只连接在一个节点上。
每个«edges»都被标记,并将被视为一个事件。
每个节点只包含一个 ID。
Oracle (12c) 表如下所示: http ://sqlfiddle.com/#!4/79cdb5/4/0
在表上,我运行了此查询 ,并且我希望在其伪列 CONNECT_BY_ISLEAF 中具有 1 的行之一改为 0。
这是有罪的行: http ://sqlfiddle.com/#!4/79cdb5/3/2
我完全无法理解为什么甲骨文不认为这一行显然是一片叶子。
表数据说明
在表格中,我使用的每一行代表一个事件(或图形边缘)加上它所连接的节点。
VUID 列是“上一个”节点,AUID 是«step»,EVENT 是事件标签,NEW_VUID 是“下一个”节点。
事件 D 和 U 例外,它们只有 1 个节点连接,并且该节点将始终位于 VUID 列中(即使对于 D 事件,该节点是“下一个”节点)。
错误请求的描述和目的
在这里,我将提供一些有关我正在执行的请求的背景信息
我的最终目标是根据表中的数据重新创建此图表。为此,我按以下步骤进行:
- 构建 «forward» 树,每个根必须是具有 D «edge» 的节点
- 构建«reverse»树,每个根都是没有子节点的节点
- “合并”所有相关的树,最终得到想要的图。最终图表应接近本问题开头显示的图表。
要使用 oracle 创建树,我认为最简单的方法是进行正确的分层查询,然后使用伪列 SYS_CONNECT_BY_PATH 并在 CONNECT_BY_ISLEAF = 1 上进行过滤,这是因为只使用叶子加上每个叶子的路径很容易重新创建树。
但是我被卡住了,因为出于某种原因,我不明白 Oracle 没有像我一样考虑所有叶子。不考虑包含节点 88888 的叶子