我有下表:
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 :(得分:2)
来自CONNECT_BY_ROOT
的顶级家长取决于您的起始条件以及您走树的方向。你向后走树,所以根本就是这样。这真的是你的起始条件。
您实际上已经拥有了所需的信息,但在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。 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
答案 1 :(得分:0)
在LEVEL上制作一个WHERE条件
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;