通过先前的oracle连接

时间:2012-10-05 12:16:36

标签: oracle recursive-query connect-by

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

表:

A       B 
P1      -
P2      P1
C1      P2
C2      P2

B是来自同一个表的外键

查询是:

SELECT level niveau, A
from table parent, table child
START WITH A IN
( 'P0','P1','C2')
CONNECT BY PRIOR  A= B

结果

1 P1
1 P2
  2 C1
  2 C2
1 C2

为什么“2 C2”会出现?

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

1 P1
1 P2
  2 C1
1 C2

2 个答案:

答案 0 :(得分:2)

首先评估

Connect by条件,start with以后。在您的情况下,C2既是P2的子节点又是层次结构的根节点。这就是它在你的结果中出现两次的原因。

来自Oracle Documentaion

  

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中所示的顺序返回行。在里面   图中,孩子出现在父母的下方。有关的解释   分层树,

答案 1 :(得分:0)

将一个节点设置为根节点意味着它必须以一个节点开始然后它将对您有效我有同样的问题我希望这可以帮助您

SELECT level niveau, A
from table parent, table child
START WITH A IN ='P1'
CONNECT BY PRIOR  A= B