2016-08-23 2 views
-2

orig_system имеет DNB в качестве значения, и у них есть много owner_table_id, связанных с DNB. Я пытаюсь привести все идентификаторы из нескольких строк в одну строку.Как смоделировать функциональность LISTAGG в Oracle 10g?

Но Oracle 10g не поддерживает listagg. Есть ли другой способ объединить все OWNER_TABLE_ID в одной строке для DNB.

Ниже запрос используется:

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 

Ниже приведен образец данных:

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

Ожидаемый результат:

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

Может быть, вам нужно «GROUP BY» что-то другое, кроме 'OWNER_TABLE_ID'? – mustaccio

+2

Целая коллекция подходов: http://stackoverflow.com/questions/14243131/concatenate-results-from-a-sql-query-in-oracle – Codo

+0

См. [** Методы агрегирования строк Oracle **] (https://lalitkumarb.wordpress.com/category/oracle-string-aggregation/) –

ответ

0

Вот решение с использованием иерархического запроса (с все колокола и свистки) и аналитическая функция row_number() - оба доступны в Oracle 10. ПРИМЕЧАНИЕ: условие partition by необходимо, если у вас более одного ORIG_SYSTEM; Я заказал OWNER_TABLE_ID по null (что означает «случайным образом»), но вы можете заказать их чем-то по мере необходимости (например, сами по себе, увеличиваясь или уменьшая порядок - не было такого порядка, видимого в вашем примере) ,

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

Спасибо .. предоставленные мной данные - это всего лишь пример данных, которые у нас есть больше один ORIG_SYSTEM и более 1000 OWNER_TABLES_id. вышеуказанный запрос не работал. является их любым другим решением .. .. с оракулом 11 г очень легко, но оракул 10 г я не могу сделать. –

+0

«Не работает» не очень полезно. Что не сработало? Я намеренно написал запрос таким образом, чтобы разрешить более одного 'ORIG_SYSTEM', была ли проблема с этим? Скорее всего, вы получили строки длиной более 4000 символов, что означает, что вам нужно работать с CLOB. Но лучше всего, если вы расскажете нам все, что проблемы, которые вместо нас угадывают. – mathguy

+0

NP .. попробовали другой запрос, и это работает нормально. но он заканчивается сообщением об ошибке –