在使用
connect by
尝试在 Oracle 中进行分层查询时,它会为每个父记录返回重复的子记录(基于列关联)。
例如:
drop table t1 purge;
create table t1(en varchar2(10),bug number, mgr varchar2(10));
insert into t1 values('a',101,'z');
insert into t1 values('a',102,'z');
insert into t1 values('a',103,'z');
insert into t1 values('a',104,'z');
insert into t1 values('b',201,'a');
insert into t1 values('b',202,'a');
insert into t1 values('b',203,'a');
insert into t1 values('c',301,'z');
insert into t1 values('c',302,'z');
insert into t1 values('c',303,'z');
commit;
select en, bug, level from t1
start with mgr='z'
connect by prior en=mgr;
返回以下结果:
EN BUG LEVEL
a 101 1
b 201 2
b 203 2
b 202 2
a 102 1
b 201 2
b 203 2
b 202 2
a 103 1
b 201 2
b 203 2
b 202 2
a 104 1
b 201 2
b 203 2
b 202 2
c 301 1
c 302 1
c 303 1
但是,我所期望的是根据列
en
和mgr
中定义的层次结构显示每个唯一的错误编号。
我期望的输出是(基于
mgr
列):
EN BUG LEVEL
a 101 1
a 102 1
a 103 1
c 301 1
c 302 1
c 303 1
b 201 2
b 203 2
b 202 2
如果有人指出我在这里缺少什么,那将是一个很大的帮助。
您需要使用
en
和 mgr
的不同值来创建树。然后才加入错误代码。
可以通过以下查询完成:
with dist_pairs as (
select distinct en, mgr
from t1
),
tree as(
select en, level lvl
from dist_pairs
start with mgr='z'
connect by prior en=mgr
)
select tree.lvl, t1.*
from t1
join tree on (t1.en=tree.en)
演示这里.