2

我有一个包含分层元素的表

桌子 :

AB
P1 -
P2 P1
C1 P2
C2 P2

B 是来自同一张表的外键

查询是:

SELECT 级别 niveau, A
从表父,表子
从一个 IN 开始
('P0','P1','C2')
由先前的 A = B 连接

结果

1个P1
1 P2
  2 C1
  2 C2
1个C2

为什么会出现“2 C2”?

尽管它不正确,但所需的结果是,我:

1个P1
1 P2
  2 C1
1个C2
4

2 回答 2

2

Connect by先评估条件,start with然后再评估。在您的情况下,C2 既是 P2 的子节点,又是层次结构的根节点。这就是为什么它出现在您的结果中两次。

来自Oracle 文档

Oracle 按如下方式处理分层查询:

如果存在连接,则首先评估连接,无论连接是在 FROM 子句中指定还是使用 WHERE 子句谓词。

评估 CONNECT BY 条件。

评估任何剩余的 WHERE 子句谓词。

然后,Oracle 使用来自这些评估的信息通过以下步骤形成层次结构:

Oracle 选择层次结构的根行——那些满足 START WITH 条件的行。

Oracle 选择每个根行的子行。每个子行必须满足关于其中一个根行的 CONNECT BY 条件的条件。

Oracle 选择连续几代的子行。Oracle 首先选择步骤 2 中返回的行的子代,然后选择这些子代的子代,以此类推。Oracle 总是通过评估与当前父行相关的 CONNECT BY 条件来选择子行。

如果查询包含没有连接的 WHERE 子句,则 Oracle 会从层次结构中删除所有不满足 WHERE 子句条件的行。Oracle 对每一行单独评估此条件,而不是删除不满足条件的行的所有子行。

Oracle 按图 9-1 所示的顺序返回行。在图中,孩子出现在父母的下方。对于层次树的解释,

于 2012-10-05T13:23:28.467 回答
0

将一个节点设置为根节点意味着它必须从一个节点开始然后它会为你工作我有同样的问题我希望这对你有帮助

SELECT level niveau, A
from table parent, table child
START WITH A IN ='P1'
CONNECT BY PRIOR  A= B
于 2013-04-29T06:19:23.903 回答