2016-08-23 1 views
-2

orig_system a DNB comme valeur, et ils ont beaucoup de owner_table_id associé à DNB. Je suis en train d'essayer de ramener tous les ID de plusieurs lignes à une seule ligne. Mais Oracle 10g ne prend pas en charge listagg. Existe-t-il un autre moyen de concaténer tous les OWNER_TABLE_ID dans une seule ligne pour DNB.Comment simuler la fonctionnalité 'LISTAGG' dans Oracle 10g?

Ci-dessous la requête utilisée:

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 

est Ci-dessous les données de l'échantillon:

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

Résultat attendu:

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

Peut-être avez-vous besoin de 'GROUP BY' autre chose que' OWNER_TABLE_ID'? – mustaccio

+2

Une collection complète d'approches: http://stackoverflow.com/questions/14243131/concatenate-results-from-a-sql-query-in-oracle – Codo

+0

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

Répondre

0

Voici une solution en utilisant une requête hiérarchique (avec toutes les cloches et les sifflets) et la fonction analytique row_number() - les deux disponibles dans Oracle 10. NOTE: la clause partition by est nécessaire si vous en avez plusieurs ORIG_SYSTEM; J'ai commandé les OWNER_TABLE_ID par null (ce qui signifie "au hasard"), mais vous pouvez les commander par quelque chose comme nécessaire (par exemple, par eux-mêmes, dans l'ordre croissant ou décroissant - il n'y avait pas un tel ordre visible dans votre exemple) .

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

Merci .. les données fournis sont simplement des données d'échantillon, nous avons plus un ORIG_SYSTEM et plus de 1000 OWNER_TABLES_id. la requête ci-dessus n'a pas fonctionné. est leur une autre solution .. ..with oracle 11 g est très facile mais oracle 10 g je suis incapable de faire. –

+0

"N'a pas fonctionné" n'est pas très utile. Qu'est-ce qui n'a pas fonctionné? J'ai délibérément écrit la requête de manière à permettre plus d'un 'ORIG_SYSTEM', y avait-il un problème avec cela? Plus probablement, vous avez fini avec des chaînes de plus de 4000 caractères, ce qui signifie que vous devez travailler avec des CLOB. Mais il vaut mieux que vous nous disiez tout ce que les problèmes au lieu de nous deviner. – mathguy

+0

NP .. ont essayé une autre requête et cela fonctionne très bien. mais il finit avec le message d'erreur –