如何高效能拆分一个字段为多行

来源:未知 责任编辑:责任编辑 发表时间:2015-03-01 01:40 点击:

如何高效能拆分一个字段为多行
 
我本意是将表中的一个字段拆分成多行,例如'aaa,bbb'拆分为
'aaa'
'bbb'
现在测试如下:
 
[sql] 
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  
  www.2cto.com  
返回结果如下:
[sql] 
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  
  www.2cto.com  
--======================================================
看起来connect by之后产生了大量重复数据,于是加入distinct后取得正确数据。
反思:
我构造的测试数据仅仅只有三行,最长的拆分资料仅3段'eee,fff,ggg',却产生了21笔资料。如果测试数据增多,或者需拆分的段
数量增多,那么connect by产生的数据将是海量的。
用此种方法实际处理生产库数据时,问题马上显现出来,仅17笔资料,最长拆分字段为8段,竟然产生了738万笔资料,尽管我使用
了distinct,依然慢的很。
 
解决方案:用Join方式取代connect by方式
 
[sql] 
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,  
       substr(t.ca,  
              instr(t.ca, ',', 1, d.lv) + 1,  
              instr(t.ca, ',', 1, d.lv + 1) -  
              (instr(t.ca, ',', 1, d.lv) + 1)) AS d  
  FROM (SELECT c1,  
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • Request.ServerVariables 参数大全
  • 查看sql修改痕迹(SQL Change Tracking on Table)
  • 写给MongoDB开发者的50条建议Tip1
  • Percolator与分布式事务思考(二)
  • SQL Server、Oracle、db2所提供的简装版(Express)比较
  • App数据层设计及云存储使用指南
  • 导入excel文件处理流程节点的解决方案
  • MongoDB安装为Windows服务方法与注意事项
  • PostgreSQL 安装问题
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索 - 移动版 - 返回顶部
Copyright © 2008-2013 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1