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

5jdjgkvh  于 2023-04-29  发布在  Oracle
关注(0)|答案(1)|浏览(116)

在Oracle中尝试使用connect by进行分层查询时,它会为每个父记录返回重复的子记录(基于列关联)。
例如:

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

但是,我所期望的是基于列enmgr中定义的层次结构来分层显示每个唯一的bug编号。
我期望的输出是(基于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

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

更新要求按每个员工的bug数量进行分组。预期输出:

EN  BUG_COUNT   LEVEL
a   4           1
c   3           1
b   3           2

更新2如果我们必须按每个员工和经理级别的计数进行分组,查询将是什么?预期输出为:

MGR  EN   EN_BUG_COUNT  CUMULATIVE_BUG_COUNT    LEVEL
z    null         null                    10        0
z    a               4                     7        1
a    b               3                     3        2
z    c               3                     3        1
i1icjdpr

i1icjdpr1#

您需要使用enmgr的不同值创建树。然后才加入错误代码。
可以通过以下查询完成:

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)

Demo在这里
聚合输出更容易:

select en, BUG_COUNT, level
from (
  select en, mgr, count(*) BUG_COUNT
  from t1
  group by en, mgr) dist_pairs
start with mgr='z'
connect by prior en=mgr

Demo在这里

相关问题