如何修复 Oracle 分层查询返回重复记录?

问题描述 投票:0回答:1

在使用

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

如果有人指出我在这里缺少什么,那将是一个很大的帮助。

oracle duplicates hierarchical
1个回答
1
投票

您需要使用

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)

演示这里.

© www.soinside.com 2019 - 2024. All rights reserved.