2016-08-23 3 views
-2

orig_system hat DNB als Wert, und sie haben viel owner_table_id zu DNB zugeordnet. Ich versuche, alle IDs aus mehreren Zeilen in eine Zeile zu bringen.Wie simuliere ich 'LISTAGG' Funktionalität in Oracle 10g?

Aber Oracle 10g unterstützt nicht listagg. Gibt es eine andere Möglichkeit, alle OWNER_TABLE_ID in einer einzigen Zeile für DNB zu verketten.

Unten finden Sie die Abfrage verwendet:

SELECT OWNER_TABLE_ID,LISTAGG (ORIG_SYSTEM,',') WITHIN GROUP (ORDER BY ORIG_SYSTEM) 
    from APPS.HZ_ORIG_SYS_REFERENCES 
    WHERE ROWNUM < 100 GROUP BY OWNER_TABLE_ID 

Im Folgenden finden Sie die Beispieldaten:

OWNER_TABLE_ID, ORIG_SYSTEM 
182403 DNB 
16604 DNB 
84818 DNB 
172891 DNB 
16605 DNB 
84819 DNB 
205544 DNB 
16606 DNB 
84820 DNB 

Erwartetes Ergebnis:

ORIG_SYSTEM OWNER_TABLE_ID, 
DNB   182403,16604,84818,72891,16605,84819,205544,16606,84820" 
+0

Möglicherweise müssen Sie 'GROUP BY' etwas anderes als' OWNER_TABLE_ID'? – mustaccio

+2

Eine ganze Sammlung von Ansätzen: http://stackoverflow.com/questions/14243131/concatenate-results-from-a-sql-query-in-oracle – Codo

+0

Siehe [** Oracle String Aggregation Techniques **] (https://lalitkumarb.wordpress.com/category/oracle-string-aggregation/) –

Antwort

0

Hier ist eine Lösung, die eine hierarchische Abfrage (mit alle Schnickschnack) und die analytische Funktion row_number() - beide in Oracle 10 verfügbar. HINWEIS: Die partition by Klausel wird benötigt, wenn Sie mehr als eine ORIG_SYSTEM haben; Ich bestellte die OWNER_TABLE_ID 's von null (was "zufällig" bedeutet), aber Sie können sie durch etwas nach Bedarf bestellen (zum Beispiel, entweder in aufsteigender oder absteigender Reihenfolge - es gab keine solche Reihenfolge in Ihrem Beispiel obwohl) .

with 
    hz_orig_sys_references (owner_table_id, orig_system) as (
     select 182403, 'DNB' from dual union all 
     select 16604 , 'DNB' from dual union all 
     select 84818 , 'DNB' from dual union all 
     select 172891, 'DNB' from dual union all 
     select 16605 , 'DNB' from dual union all 
     select 84819 , 'DNB' from dual union all 
     select 205544, 'DNB' from dual union all 
     select 16606 , 'DNB' from dual union all 
     select 84820 , 'DNB' from dual 
    ), 
    prep (owner_table_id, orig_system, rn) as (
     select owner_table_id, orig_system, 
       row_number() over (partition by orig_system order by null) 
     from hz_orig_sys_references 
    ) 
select orig_system, 
     ltrim(sys_connect_by_path(owner_table_id, ','), ',') as owner_tables 
from prep  
where connect_by_isleaf = 1 
connect by orig_system = prior orig_system and rn = prior rn + 1 
start with rn = 1; 

ORIG_SYSTEM OWNER_TABLES 
------------ ---------------------------------------------------------- 
DNB   182403,16604,84818,172891,84820,84819,205544,16606,16605 
+0

Danke .. die Daten, die ich zur Verfügung gestellt habe, sind nur Beispieldaten ein ORIG_SYSTEM und mehr als 1000 OWNER_TABLES_id. Die obige Abfrage hat nicht funktioniert. ist ihre eine andere Lösung .. .. mit Orakel 11 g ist sehr einfach, aber Orakel 10 g kann ich nicht tun. –

+0

"Hat nicht funktioniert" ist nicht sehr hilfreich. Was hat nicht funktioniert? Ich habe die Abfrage absichtlich so geschrieben, dass mehr als ein 'ORIG_SYSTEM' möglich ist. Gab es da ein Problem? Wahrscheinlicher ist, dass Sie mehr als 4000 Zeichen lang waren, was bedeutet, dass Sie mit CLOBs arbeiten müssen. Aber es ist am besten, wenn Sie uns alle erzählen, wo die Fragen statt uns raten. – mathguy

+0

NP .. habe eine andere Abfrage versucht und das funktioniert gut. aber es endet mit der Fehlermeldung –