通过

2015-02-24 45 views
2

获取使用连接树的最高层部分,我有以下表格:通过

CREATE TABLE Z_BOM2 (A VARCHAR2(4 CHAR), B VARCHAR2(4 CHAR)); 
Insert into Z_BOM2 (A, B) Values ('A', 'B'); 
Insert into Z_BOM2 (A, B) Values ('A', 'C'); 
Insert into Z_BOM2 (A, B) Values ('C', 'D'); 
Insert into Z_BOM2 (A, B) Values ('C', 'F'); 
Insert into Z_BOM2 (A, B) Values ('D', 'E'); 
COMMIT; 



SELECT * FROM Z_BOM2; 
A B 
A C 
C D 
C F 
D E 

A是家长和B是一个孩子。

我想在查询中输入子值“E”和“F”,并且只有顶级父母对于这两者都应该是'A'。下面是我使用的查询:

select SYS_CONNECT_BY_PATH (a,'/') as path, a, b, level, CONNECT_BY_ISLEAF AS leaf, CONNECT_BY_ROOT b top_level 
    from Z_BOM2 
    connect by prior a = b 
    start with b IN ('E', 'F'); 

哪个返回如下:

/D D E 1 0 E 
/D/C C D 2 0 E 
/D/C/A A C 3 1 E 
/C C F 1 0 F 
/C/A A C 2 1 F 

为什么没有返回正确的顶级父?

+0

它似乎返回正确的顶级父级。 “/ D/C/AAC 3 1 E”为E和“/ C/AAC 2 1 F” – Taemyr 2015-02-24 08:29:52

+0

选择此图像:https://community.oracle.com/servlet/JiveServlet/showImage/2-12914163-114891/ a.jpg 在我的情况下,可以有多个顶级节点,所以我不能从顶端开始。我只给予其中一个孩子一个价值,我需要找到在其结构中使用该孩子的所有顶级节点。 在这幅图中:节点B,A是顶级父母。 - 如果从小孩C开始,顶级父母应该是B - 如果从小孩D开始,顶级父母应该是B,A - 如果从小孩J开始,顶级父母应该是A. 希望能够使更有意义。 – Darko 2015-02-24 15:53:12

回答

0

就LEVEL

WITH t AS 
    (select SYS_CONNECT_BY_PATH (a,'/') as path, a, b, level as LEV, 
     CONNECT_BY_ISLEAF AS leaf, CONNECT_BY_ROOT b top_level 
    from Z_BOM2 
    connect by prior a = b 
    start with b IN ('E', 'F')) 
SELECT * 
FROM t 
WHERE LEV = 1; 
2

CONNECT_BY_ROOT顶层父是基于你的起始条件,你走在树的方向WHERE条件。你向后走树,所以'根'真的是你的起始条件。

实际上,你有你想要已经信息,但在A列中,叶节点:

select SYS_CONNECT_BY_PATH (a,'/') as path, a, b, level, 
    CONNECT_BY_ISLEAF AS leaf, CONNECT_BY_ROOT b top_level 
from Z_BOM2 
where CONNECT_BY_ISLEAF = 1 
connect by prior a = b 
start with b IN ('E', 'F'); 

PATH     A B   LEVEL  LEAF TOP_LEVEL 
-------------------- ---- ---- ---------- ---------- --------- 
/D/C/A    A C    3   1 E   
/C/A     A C    2   1 F   

只得到你感兴趣的顶级价值,只包括列A在选择列表。

SQL Fiddle demo

这适用于您在评论中添加的结构; SQL Fiddle。 C得到B; J得到A; D同时得到A和B:

select CONNECT_BY_ROOT b query_val, a as top_level 
from Z_BOM2 
where CONNECT_BY_ISLEAF = 1 
connect by prior a = b 
start with b IN ('C', 'D', 'J'); 

QUERY_VAL TOP_LEVEL 
--------- --------- 
C   B   
D   A   
D   B   
J   A   
+0

这是正确的。谢谢! – Darko 2015-02-24 19:40:38