我本意是将表中的一个字段拆分成多行,例如'aaa,bbb'拆分为
'aaa'
'bbb'
现在测试如下:
with t1 as
(
select 3 c1,'eee,fff,ggg' c2 from dual UNION ALL
select 2 c1,'ccc,ddd' c2 from dual UNION ALL
SELECT 1 c1,'aaa,bbb' c2 FROM dual
)
select c1,LEVEL,replace(regexp_substr(c2,'[^,]+',1,level),',',' ') c2
from t1
connect BY level<=length(c2)-length(replace(c2,',',''))+1
order by c1,level返回结果如下:
C1 LEVEL C2
1 1 aaa
1 2 bbb
1 2 bbb
1 2 bbb
2 1 ccc
2 2 ddd
2 2 ddd
2 2 ddd
3 1 eee
3 2 fff
3 2 fff
3 2 fff
3 3 ggg
3 3 ggg
3 3 ggg
3 3 ggg
3 3 ggg
3 3 ggg
3 3 ggg
3 3 ggg
3 3 ggg--======================================================
看起来connect by之后产生了大量重复数据,于是加入distinct后取得正确数据。
反思:
我构造的测试数据仅仅只有三行,最长的拆分资料仅3段'eee,fff,ggg',却产生了21笔资料。如果测试数据增多,或者需拆分的段
数量增多,那么connect by产生的数据将是海量的。
用此种方法实际处理生产库数据时,问题马上显现出来,仅17笔资料,最长拆分字段为8段,竟然产生了738万笔资料,尽管我使用
了distinct,依然慢的很。我的想法是如何只取每个level的第一个数值,避免重复数据,请教下各位大侠有没有合适的方法,请指教!
'aaa'
'bbb'
现在测试如下:
with t1 as
(
select 3 c1,'eee,fff,ggg' c2 from dual UNION ALL
select 2 c1,'ccc,ddd' c2 from dual UNION ALL
SELECT 1 c1,'aaa,bbb' c2 FROM dual
)
select c1,LEVEL,replace(regexp_substr(c2,'[^,]+',1,level),',',' ') c2
from t1
connect BY level<=length(c2)-length(replace(c2,',',''))+1
order by c1,level返回结果如下:
C1 LEVEL C2
1 1 aaa
1 2 bbb
1 2 bbb
1 2 bbb
2 1 ccc
2 2 ddd
2 2 ddd
2 2 ddd
3 1 eee
3 2 fff
3 2 fff
3 2 fff
3 3 ggg
3 3 ggg
3 3 ggg
3 3 ggg
3 3 ggg
3 3 ggg
3 3 ggg
3 3 ggg
3 3 ggg--======================================================
看起来connect by之后产生了大量重复数据,于是加入distinct后取得正确数据。
反思:
我构造的测试数据仅仅只有三行,最长的拆分资料仅3段'eee,fff,ggg',却产生了21笔资料。如果测试数据增多,或者需拆分的段
数量增多,那么connect by产生的数据将是海量的。
用此种方法实际处理生产库数据时,问题马上显现出来,仅17笔资料,最长拆分字段为8段,竟然产生了738万笔资料,尽管我使用
了distinct,依然慢的很。我的想法是如何只取每个level的第一个数值,避免重复数据,请教下各位大侠有没有合适的方法,请指教!
解决方案 »
- oracle锁的机制
- 求高手帮写一个SQL语句,在线等..........
- group by 和 order by 如何联合使用?急!谢谢指点!
- 存储过程 :提示错误:行号=1 列号=30 错误文本=PLS-00103出现”create"在需要下列之一时: (; is with authid as cluster
- 一个简单的查询,谢谢.
- 关于oracle部署,请各位老大给些建议
- 紧急高分求问导数据难题(远程数据库,不同用户)
- 关于oracle9i的时间段查询sql语句写法问题
- PL/SQL问题 DBMS_UTILITY.get_time 可以获得当前时间,但上一天的时间怎么取?
- 显示记录速度的问题
- oracle 11g PLS-00201问题
- plsql 无监听程序
'[^,]+',
1,
l_count) from t1 t,(select level l_count from dual connect by level <= 3)
where regexp_substr(c2,
'[^,]+',
1,
l_count) is not null
select regexp_substr('a,b', '[^,]+',1,rownum) from dual connect by
rownum<=length('a,b')-length(replace('a,b', ',', ''))+1;
rownum<=length('a,b')-length(replace('a,b', ',', ''))+1;