--첫 번째 with t1 as ( select 'no1' as cd,'한국,미국,일본' as nt from dual union all select 'no2','한국,중국' from dual ) , t2 as ( select 'no1' as cd,'한국' as rg from dual union all select 'no1','미국' from dual ) select a.cd, a.nt , listagg(b.rg,',') within group(order by b.cd) rg from t1 a , t2 b where a.cd = b.cd(+) group by a.cd, a.nt --두 번째 with t1 as ( select 'no1' as cd,'한국,미국,일본' as nt from dual union all select 'no2','한국,중국' from dual ) , t2 as ( select 'no1' as cd,'한국' as rg from dual union all select 'no1','미국' from dual ) select cd , listagg(rg,',') within group(order by lv) rg from ( select cd, regexp_substr(nt,'[^,]+',1,lv) rg, lv from t1 , (select level lv from dual connect by level < 20) where regexp_count(nt,',') >= lv - 1 ) a where not exists (select 1 from t2 b where b.cd = a.cd and rg = a.rg) group by cd
--두 번째 다른 방법 select a.cd , trim(both ',' from regexp_replace(regexp_replace(a.nt,b.rg),',+',',')) rg from t1 a, ( select cd, listagg(rg,'|') within group(order by rg) rg from t2 group by cd ) b where a.cd = b.cd(+)
WITH A AS ( SELECT 'NO1' CD , '한국,미국,일본' COUNTRY FROM DUAL UNION ALL SELECT 'N02' , '한국,중국' FROM DUAL ) , B AS ( SELECT 'NO1' CD , '한국' AREA FROM DUAL UNION ALL SELECT 'NO1' , '미국' FROM DUAL ) SELECT A.CD , A.COUNTRY , LISTAGG(AREA , ',') WITHIN GROUP(ORDER BY AREA DESC) AREA1 , LTRIM(REPLACE(A.COUNTRY ,LISTAGG(AREA , ',') WITHIN GROUP(ORDER BY AREA DESC) ,'') ,',')AEREA2 FROM A , B WHERE A.CD = B.CD(+) GROUP BY A.CD , A.COUNTRY ORDER BY A.CD DESC
WITH A AS ( SELECT 'NO1' CD , '독일,한국,미국,일본' COUNTRY FROM DUAL UNION ALL SELECT 'N02' , '한국,중국' FROM DUAL ) , B AS ( SELECT 'NO1' CD , '한국' AREA FROM DUAL UNION ALL SELECT 'NO1' , '미국' FROM DUAL ) SELECT cd , RTRIM(LTRIM( REGEXP_REPLACE(REGEXP_REPLACE( COUNTRY , AREA ,''),'[,]+' , ',') ,','),',') v1 FROM ( SELECT A.CD, A.COUNTRY , LISTAGG(B.AREA , '|') WITHIN GROUP(ORDER BY B.AREA ) AREA FROM A , B WHERE A.CD = B.CD(+) GROUP BY A.cd, A.COUNTRY ORDER BY A.CD DESC )