5

首先简要描述我的问题

我有一个包含可能在这个伪有向图中表示的数据的表: 伪图图像 我说它是一个伪图,因为我有一些“边”,它们只连接在一个节点上。

每个«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 事件,该节点是“下一个”节点)。

错误请求的描述和目的

在这里,我将提供一些有关我正在执行的请求的背景信息

我的最终目标是根据表中的数据重新创建此图表。为此,我按以下步骤进行:

  1. 构建 «forward» 树,每个根必须是具有 D «edge» 的节点
  2. 构建«reverse»树,每个根都是没有子节点的节点
  3. “合并”所有相关的树,最终得到想要的图。最终图表应接近本问题开头显示的图表。

在第 1 步中。我最终应该得到如下所示的正向树: 第一个计算的前向树 第二个计算前向树

要使用 oracle 创建树,我认为最简单的方法是进行正确的分层查询,然后使用伪列 SYS_CONNECT_BY_PATH 并在 CONNECT_BY_ISLEAF = 1 上进行过滤,这是因为只使用叶子加上每个叶子的路径很容易重新创建树。

但是我被卡住了,因为出于某种原因,我不明白 Oracle 没有像我一样考虑所有叶子。不考虑包含节点 88888 的叶子

4

1 回答 1

5

我没有花时间完全理解您的数据模型,并且建议您在表中没有某种主键的情况下可能难以以可理解的方式实现目标。 CONNECT BY是 Oracle 中更高级的查询形式之一,传统的PRIOR t.id = t.parent_id关系使其更容易。

无论如何,您发现令人困惑的结果的原因是因为您的数据中有这一行:

into TEST_HISTORY values (88888, 3, 'U', null)

它是您认为是叶子的行的“孩子”,使得该行实际上根本不是叶子。

运行不带该WHERE子句的查询,您应该会看到它。CONNECT BY发生在子句之前WHERE过滤WHERE子句中的叶子不会使他们现在没有孩子的父母变成叶子。

于 2017-08-21T00:02:17.663 回答