うまくいかなかった理由はわかりません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
だけで、これは完全には関係ありません。少なくとも、それは 11gR2 です。利用可能な10g インスタンスはありませんが 、以前のバージョンでは返されると思います。もしそうならは必要なく、次のようになります:cast
varchar2
wm_concat
clob
org
clob
wm_concat
varchar2
cast
select issue_id,
replace(wm_concat(owner_name), ',', ', ') || ', ' || owner_org as owner
from (
...
あなたの価値がどこから来ているのかわからないので、これはおそらく単純化されています。また、問題が(問題または同等のものではなく)人にリンクされていて、問題に2つの問題がある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 が回答を追加する必要があります。この部分は削除します。とにかくやってみたかったのですが、前に見たことはありましたが、覚えていませんでした...