в 11gR2 вы можете использовать listAgg
with person as
(
select 1 id_person, 'Jack Black' FullName from dual
union all
select 2 id_person, 'Joe White' FullName from dual
)
, telephone as
(
select 5 id_telephone , 1 Id_person, 333222111 phone_Number , 'Mobile' phone_type from dual
union all
select 6 id_telephone , 1 Id_person, 444333222 phone_Number , 'Fax' phone_type from dual
union all
select 7 id_telephone , 2 Id_person, 555444333 phone_Number , 'Mobile' phone_type from dual
)
select person.FullName
,listagg(telephone.phone_type || ': ' || telephone.phone_number , ', ') within group (order by person.FullName ) personToPhone
from person
inner join
telephone
on person.id_person = telephone.id_person
group by person.FullName ;
FULLNAME PERSONTOPHONE
---------- -----------------------------------
Jack Black Fax: 444333222, Mobile: 333222111
Joe White Mobile: 555444333
Посмотрите на этот вопрос для других подходов: список через запятую как результат оператора выбора в Oracle
РЕДАКТИРОВАТЬ
для 10g вы можете использовать XMLAgg
with person as
(
select 1 id_person, 'Jack Black' FullName from dual
union all
select 2 id_person, 'Joe White' FullName from dual
)
, telephone as
(
select 5 id_telephone , 1 Id_person, 333222111 phone_Number , 'Mobile' phone_type from dual
union all
select 6 id_telephone , 1 Id_person, 444333222 phone_Number , 'Fax' phone_type from dual
union all
select 7 id_telephone , 2 Id_person, 555444333 phone_Number , 'Mobile' phone_type from dual
)
select person.FullName
,RTRIM(XMLAGG(XMLELEMENT(e,telephone.phone_type || ': ' || telephone.phone_number || ',')).EXTRACT('//text()'),',') AS TelephoneToType
from person
inner join
telephone
on person.id_person = telephone.id_person
group by person.FullName ;
FULLNAME TELEPHONETOTYPE
---------- ---------------------------------
Jack Black Mobile: 333222111,Fax: 444333222
Joe White Mobile: 555444333
(как это сделал Марк Бейкер в связанном вопросе SO)