Sql 使用Connect by获取树中最顶层的部件
我有下表:Sql 使用Connect by获取树中最顶层的部件,sql,oracle,hierarchical-query,Sql,Oracle,Hierarchical Query,我有下表: 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');
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
为什么它没有返回正确的顶级父级?在级别上设置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;
CONNECT\u BY\u 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
这也适用于您在注释中添加的结构。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
它似乎返回了正确的顶级父级。“/D/C/A C 3 1 E”代表E和“/C/A C 2 1 F”检查此图像:在我的情况下,可以有多个顶级节点,因此我不能从顶层开始。我只为其中一个子节点指定了一个值,我需要找到在其结构中使用该子节点的所有顶级节点。在此图片中:节点B、A是顶级父节点。-如果从孩子C开始,最高级别的父母应该是B-如果从孩子D开始,最高级别的父母应该是B,A-如果从孩子J开始,最高级别的父母应该是A。希望这更有意义。