在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
但是,我所期望的是基于列en
和mgr
中定义的层次结构来分层显示每个唯一的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
1条答案
按热度按时间i1icjdpr1#
您需要使用
en
和mgr
的不同值创建树。然后才加入错误代码。可以通过以下查询完成:
Demo在这里
聚合输出更容易:
Demo在这里