求一Oracle 数据库 的插入数据的解决办法。。分不够再加

pixiaozheng 2010-07-02 03:54:37
问题描述:新系统上线,需要把老系统中的数据转移到新系统中。
老系统中有一表,顾客信息表,在新系统中变为一个顾客信息主表,和N个信息子表

具体问题:老系统顾客表有3个段,手机,固定电话,小灵通,每个段 都可以存多个值,用"/"隔开
如手机段,138xxxxxxxx/137xxxxxxxxx,具体存几个是不定的,可以为空,可以一个,也可以多个
在新系统中,这种关系体现为,顾客主表,顾客手机子表,顾客固定电话子表,顾客小灵通子表
3个子表的结构都一样,主键id,外键顾客id,号码,更新时间。
需求: 3个段的需求都一样。这里以手机段为例.
老系统中某个顾客信息的手机段为空,那么新系统中手机子表也为空。
如果有1个手机号,则手机子表有一行记录,
如果有2个手机号,则手机子表有二行记录。。以此类推。
多个号码的时候老系统是用"/"隔开的。

问如何能写sql语句,将老系统顾客表的3个段的值,插入到3个子表中?
或者有别的解决方法?
说明:不想用程序解决。。想直接在数据空中操作。。数据量较多。有50多万条。
请大侠帮忙解决。。。分不够再加。。谢谢。。

...全文
140 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuesongliu 2010-07-02
  • 打赏
  • 举报
回复
太崇拜了,人也给了算了。能说说处理的思路不,初学者没看懂
pixiaozheng 2010-07-02
  • 打赏
  • 举报
回复

3楼的大侠。你太神奇了。。我弄了 几百条数据才测试。。好像真的可以。
我把数据导进去。。然后再慢慢研究这个神奇的sql。。谢谢。。分全给你。。
vber1010 2010-07-02
  • 打赏
  • 举报
回复
那手机表为例,楼主试一下:

insert into new_customer_mobile
select new_customer_mobile.nextval, id, mobile
from (select a.id,
substr(a.mobile,
instr('/' || a.mobile, '/', 1, b.rn),
instr(a.mobile || '/', '/', 1, b.rn) -
instr('/' || a.mobile, '/', 1, b.rn)) mobile
from old_customer a,
(select *
from (SELECT DISTINCT id FROM old_customer),
(SELECT ROWNUM rn
FROM dual
CONNECT BY ROWNUM <=
(select max(length(mobile) -
length(replace(mobile, '/'))) + 1
from old_customer))) b
WHERE A.ID = b.ID
and length(a.mobile) - length(replace(a.mobile, '/', '')) + 1 >= b.rn)

pixiaozheng 2010-07-02
  • 打赏
  • 举报
回复
性能差点不要紧。。只要能正确的插入就可以了
这个是一次性动作。。以后不会用了的
pixiaozheng 2010-07-02
  • 打赏
  • 举报
回复

3楼的大侠很神奇。。可惜我看不大懂。。
我把表结构贴出来。。麻烦把上面的那段改成具体的表和段。。这样我可能会理解一些。谢谢。。
问题解决立马结贴

老系统 表名old_customer 顾客信息表
列名id ,主键
mobile,手机
telephone,固定电话
linktel 小灵通
新系统 表名new_customer 顾客信息表
表名new_customer_mobile 列名 id(主键),customerid(外键),no(号码)
表名new_customer_telephone 列名 id(主键),customerid(外键),no(号码)
表名new_customer_linktel 列名 id(主键),customerid(外键),no(号码)

说明:老系统顾客信息的主键id和新系统中的顾客主键id是一样的。。
forgetsam 2010-07-02
  • 打赏
  • 举报
回复
insert all
bobfang 2010-07-02
  • 打赏
  • 举报
回复
50万的数据按3楼的方法性能上面估计比较差
vber1010 2010-07-02
  • 打赏
  • 举报
回复
楼主的需求应该可以直接用一条sql实现,先看看这个是不是你要的样子:

WITH A AS(SELECT 1 id,'1382299860/136788965' item FROM dual
UNION ALL SELECT 1,'131999987/132999935' FROM dual
union all select 2,'1357778840/1366778868/150998870' from dual)

select a.id,substr(a.item,instr('/'||a.item,'/',1,b.rn),instr(a.item||'/','/',1,b.rn)-instr('/'||a.item,'/',1,b.rn))item
from a,
(select * from
(SELECT DISTINCT id FROM A),
(SELECT ROWNUM rn FROM dual CONNECT BY ROWNUM<=(
select max(length(item)-length(replace(item,'/')))+1 from a)))b
WHERE A.ID=b.ID
and length(a.item)-length(replace(a.item,'/',''))+1>=b.rn

pixiaozheng 2010-07-02
  • 打赏
  • 举报
回复
楼上的大侠能不能具体一点
iihero 2010-07-02
  • 打赏
  • 举报
回复
不想用程序,那也得使用存储过程,单条SQL语句够呛。

3,490

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧