不知道为什么wm_concat
不适合你,但我怀疑你是在错误的级别或分组奇怪。
如果我设置一些假数据:
create table issues (id number);
create table owners (id number, first varchar2(10), middle varchar2(10),
last varchar2(10), org varchar2(3));
create table issue_owners (issue_id number, owner_id number);
insert into issues (id) values (1);
insert into issues (id) values (2);
insert into issues (id) values (3);
insert into owners (id, first, middle, last, org)
values (11, 'Sam', null, 'Smith', 'AAA');
insert into owners (id, first, middle, last, org)
values (12, 'Stan', null, 'Bird', 'BBB');
insert into owners (id, first, middle, last, org)
values (13, 'Nancy', null, 'Bird', 'BBB');
insert into owners (id, first, middle, last, org)
values (14, 'Mike', null, 'Owen', 'CCC');
insert into issue_owners (issue_id, owner_id) values (1, 11);
insert into issue_owners (issue_id, owner_id) values (2, 12);
insert into issue_owners (issue_id, owner_id) values (2, 13);
insert into issue_owners (issue_id, owner_id) values (3, 14);
...赋予相同的初始输出为您配对降取样:
column issue_id format 9 heading "#"
column owner format a50 heading "Owner"
select i.id as issue_id,
o.first
|| case when o.middle is null then null else ' ' || o.middle end
|| ' ' || last || ', ' ||o.org as owner
from issues i
left join issue_owners io on io.issue_id = i.id
left join owners o on o.id = io.owner_id
order by issue_id, owner;
# Owner
-- --------------------------------------------------
1 Sam Smith, AAA
2 Nancy Bird, BBB
2 Stan Bird, BBB
3 Mike Owen, CCC
4 rows selected.
我可以用wm_concat
聚集的名字:
select issue_id,
replace(cast(wm_concat(owner_name) as varchar2(4000)), ',', ', ')
|| ', ' || owner_org as owner
from (
select i.id as issue_id,
o.first
|| case when o.middle is null then null else ' ' || o.middle end
|| ' ' || last as owner_name,
o.org as owner_org
from issues i
left join issue_owners io on io.issue_id = i.id
left join owners o on o.id = io.owner_id
)
group by issue_id, owner_org
order by issue_id, owner;
# Owner
-- --------------------------------------------------
1 Sam Smith, AAA
2 Stan Bird, Nancy Bird, BBB
3 Mike Owen, CCC
3 rows selected.
该replace
只是放在名称,这是不完全相关的,我cast
ing到varchar2
,因为wm_concat
返回clob
这会导致问题级联org
。至少,这是一个clob
在11gR2 - 我没有一个10g实例与wm_concat
可用,但我认为它在早期版本返回varchar2
;如果是的话不需要cast
,这将是更喜欢:
select issue_id,
replace(wm_concat(owner_name), ',', ', ') || ', ' || owner_org as owner
from (
...
我不知道您的org
值从所以这可能是简化来了,我不知道你想什么如果org
与某人(而非问题或您的等价物)相关联,并且问题有两个拥有不同org
值的所有者,则会发生这种情况。
如果这不是让你更近,那么也许你可以发表你的查询的简化版本,与一些固定的数据替换长多台部分,展示你是如何尝试使用wm_concat
反对;或者你自己版本的示例数据 - 构建,显示相同的行为。
替代sys_connect_by_path
方法,建议Appleman1234,对于同样的数据:
select issue_id,
ltrim(max(sys_connect_by_path(owner_name, ', '))
keep (dense_rank last order by curr), ', ')
|| ', ' || owner_org as owner
from (
select issue_id,
owner_name,
owner_org,
row_number() over (partition by issue_id order by owner_name) as curr,
row_number() over (partition by issue_id order by owner_name) - 1 as prev
from (
select i.id as issue_id,
o.first
|| case when o.middle is null then null else ' ' || o.middle end
|| ' ' || last as owner_name,
o.org as owner_org
from issues i
left join issue_owners io on io.issue_id = i.id
left join owners o on o.id = io.owner_id
)
)
group by issue_id, owner_org
connect by prev = prior curr and issue_id = PRIOR issue_id
start with curr = 1;
# Owner
-- --------------------------------------------------
1 Sam Smith, AAA
2 Nancy Bird, Stan Bird, BBB
3 Mike Owen, CCC
3 rows selected.
如果你最终使用,Appleman1234应该添加一个答案,我会删除此部分,因为他应该得到建议它的功劳!无论如何,我想尝试它,我以前看过它,但没有记住它...
没有人回答,因为我错误地问了吗?我对唐的编辑有点困惑,可能他是这么想的,因为我的研究不够深入? – user1983682
不,你问得很好,据我所知。有些人认为每个关键词都应该标注为代码,但我们到达这里的时间很长,但与您无关。人们可能只是不知道答案,就是这样。那么,尽我所能提高可读性并添加相关标签,因为我们正在谈论用SQL来做它,对吧? –
是的,谢谢。 – user1983682