我有main_mappings表,其数据如下:
mid sid
1 1,2,3
1 2,4
3 1
4 2
4 5,9
我想得到这个:
mid sids
1 1,2,3,4
3 1
4 2,5,9
我试过了:
select mid, listagg(sid, ',') within group (order by sid)
from main_mappings group by mid;
但它给了我这个:
1 1,2,3,2,4
3 1
4 2,5,9
有人可以帮忙吗?
答案 0 :(得分:0)
您应该规范化表格,以便将每个值存储在不同的行中。
对于这种情况,您可以使用嵌套表为每个csv值生成行,查找不同的行,然后在其上listagg
。
select mid, listagg(sid, ',') within group(order by sid) sids
from (
select distinct m.mid, x.column_value sid
from main_mappings m,
table(
cast (
multiset(
select regexp_substr(m.sid,'[^,]+',1,level)
from dual
connect by level <= regexp_count(m.sid,',') + 1
)
as sys.odcinumberlist)
)x )
group by mid;
答案 1 :(得分:0)
您可以尝试以下解决方案。
SELECT listagg(ra,',') WITHIN GROUP (ORDER BY ra)
FROM
(
SELECT DISTINCT (REGEXP_SUBSTR('02,02,02,02,02,03,04,03', '[^,]+', 1, LEVEL) )ra
FROM DUAL
CONNECT BY REGEXP_SUBSTR('02,02,02,02,02,03,04,03', '[^,]+', 1, LEVEL) IS NOT NULL
)