2016-09-07 3 views
0

Ich habe eine Abfrage so etwas wie diese:deutlicher listagg in oracle

select tab1.id, 
(
select listagg(tab2.surna||' '||tab2.name||':'||tab2.addr||' '||tab2.numb,', ') within group(order by tab2.name) 
from tab2 
where tab1.id=tab2.id2id /*join tab1 with tab2 */ 
)as address 
from tab1 

und das Ergebnis ist wie:

name_surname1: Adr 1, name_surname1: Adr 2, name_surname2: Adr 3

aber das exptected Ergebnis wäre so etwas wie:

name_surname1: (Adr 1, Adr 2), n ame_surname2: (addr 3)

Wie kann ich dies implementieren, um doppelte Datensätze in den Anzeigenamen zu vermeiden?

Dank

Antwort

4

Ich glaube, du 2 Ebenen von listagg dafür brauchen. Wie Sie keinen Skript vorsah Ihre Datenstruktur zu replizieren, stelle ich ein allgemeines Beispiel meines eigenen ...

with tab as (
select 's' s,'n' n, 'addr1' addr from dual 
union all 
select 's' s,'n' n, 'addr2' addr from dual 
union all 
select 'd' s,'k' n, 'addr3' addr from dual 
union all 
select 'd' s,'k' n, 'addr4' addr from dual 
) 
select listagg(res,',') within group (order by res) final_res from ( 
select s || n || ':(' ||listagg(addr,', ') within group (order by s,n) || ')'res 
from tab 
group by s||n 
) 

Ergebnis

dk:(addr3, addr4),sn:(addr1, addr2)

+0

Vielen Dank für Ihre Antwort, aber jetzt tab1.id ist ein ungültiger Bezeichner in diesem Tab1.id = tab2.id2id clause.Ich möchte tab1.id in der Nähe von final_res Attribut, aber das ist nicht erlaubt .. Irgendwelche Idee? – Anastasis

+0

@Anastasis - Wenn Sie möchten, dass Freiwillige Ihnen bei Ihrer spezifischen Tischordnung helfen, müssen Sie in Ihrem Beitrag Beispieleingabetabellen angeben. – mathguy

+0

Ela @Anastasis, wie @mathguy erwähnt, du hilfst uns nicht, dir zu helfen ;-), aber die Idee wäre, deine ursprüngliche Anfrage ein wenig zu ändern und 'id2id' in die Abfrage einzutragen, die in der Lösung gegeben ist Benenne es 'tab3') und verwende dann join' tab1, tab3 wo tab1.id = tab3.id (+) ' – Plirkee

Verwandte Themen