Comme l'a demandé Matthew, une version compatible avec 11gR2 de l'explosion des listes séparées par des virgules, en utilisant les mêmes données d'exemple étendues :
with input_data ( id, col1, col2 ) as (
SELECT 1 , '1,2,3,4', 'V1,V2,V3,V4' from dual union all
SELECT 2 , '4,5,6,7', 'V5,V6,V7,V8' from dual union all
SELECT 3 , 'A', 'VA,VB,VC,VD' from dual union all
SELECT 4 , 'E,F,G', 'VE' from dual union all
SELECT 5 , 'H,I', '' from dual union all
SELECT 6 , '', 'J,K' from dual
)
, cte (id, col1, col2, pos, combined_value) as (
select id, col1, col2, level,
regexp_substr(col1, '(.*?)(,|$)', 1, level, null, 1)
||','|| regexp_substr(col2, '(.*?)(,|$)', 1, level, null, 1)
from input_data
connect by id = prior id
and prior dbms_random.value is not null
and level <= greatest(nvl(regexp_count(col1, ','), 0),
nvl(regexp_count(col2, ','), 0)) + 1
)
select id,
col1,
col2,
listagg(combined_value, ' ') within group (order by pos) as col3
from cte
group by id, col1, col2;
ID COL1 COL2 COL3
---------- ------- ----------- ------------------------------
1 1,2,3,4 V1,V2,V3,V4 1,V1 2,V2 3,V3 4,V4
2 4,5,6,7 V5,V6,V7,V8 4,V5 5,V6 6,V7 7,V8
3 A VA,VB,VC,VD A,VA ,VB ,VC ,VD
4 E,F,G VE E,VE F, G,
5 H,I H, I,
6 J,K ,J ,K
Les CTE supplémentaires convertissent les valeurs des colonnes appropriées en une liste de nombres séparés, concaténés ensemble pour chaque ID et position dans la liste. Et comme dans la réponse de Matthew, toutes les valeurs concaténées pour chaque ID sont agrégées dans une chaîne séparée par des espaces.
Cependant, il serait toujours plus simple et probablement plus efficace de revenir à la source de la vue actuelle - en supposant qu'elle crée elle-même le fichier col1
y col2
par le biais d'une agrégation de chaînes de caractères - et baser votre nouvelle requête/vue sur cette requête originale.
La construction de vues au-dessus d'autres vues peut entraîner des problèmes de performances, car l'optimiseur ne peut pas toujours faire passer les prédicats au bon endroit. Mais créer des listes agrégées de valeurs, les diviser, puis les ré-agréger, c'est faire plus de travail que nécessaire.