十万条记录,求高效更新SQL
时间:2011-10-27
来源:互联网
卡和担保人之间1对多关系,现在要把3个担保人信息guaranty放入卡信息表card中。对于超过3个担保人的卡随机取3个担保人信息既可。
现在的处理方式是写了个存储过程,定义两个游标,分别是卡和担保人,取出每张卡信息,再根据卡号查到担保人,然后写入卡信息表。但这样效率很低,3个小时只更新了15000条。
求高效方法,可以建索引、临时表、存储过程等数据库可以使用的技术。
网上看过纵列转横列的方法,但都不知道怎么给整进来。
数据表信息
卡信息有11万条,担保信息有10万条。两个担保人的卡有5000张,三个担保人的有3000个,四个担保人的有500个
卡信息表card
SQL code
担保人表guaranty
SQL code
数据:
card
卡号,担保人1,担保人1证件号,担保人1电话,担保人2,担保人2证件号,担保人2电话,担保人3,担保人3证件号,担保人3电话
c1,null,null,null,null,null,null,null,null,null
c2,null,null,null,null,null,null,null,null,null
c3,null,null,null,null,null,null,null,null,null
c4,null,null,null,null,null,null,null,null,null
c5,null,null,null,null,null,null,null,null,null
c6,null,null,null,null,null,null,null,null,null
c7,null,null,null,null,null,null,null,null,null
c8,null,null,null,null,null,null,null,null,null
guaranty
cardno,ownername,certid,tel
c1,name1,id1,tel1
c1,name2,id2,tel2
c2,name3,id3,tel3
c2,name4,id4,tel4
c2,name5,id5,tel5
c2,name6,id6,tel6
c3,name7,id7,tel7
c4,name8,id8,tel8
希望得到最终结果:
卡号,担保人1,担保人1证件号,担保人1电话,担保人2,担保人2证件号,担保人2电话,担保人3,担保人3证件号,担保人3电话
c1,name1,id1,tel1,name2,id2,tel2,null,null,null
c2,name3,id3,tel3,name4,id4,tel4,name5,id5,tel5
c3,name7,id7,tel7,null,null,null,null,null,null
c4,name8,id8,tel8,null,null,null,null,null,null
c5,null,null,null,null,null,null,null,null,null
c6,null,null,null,null,null,null,null,null,null
c7,null,null,null,null,null,null,null,null,null
c8,null,null,null,null,null,null,null,null,null
现在的处理方式是写了个存储过程,定义两个游标,分别是卡和担保人,取出每张卡信息,再根据卡号查到担保人,然后写入卡信息表。但这样效率很低,3个小时只更新了15000条。
求高效方法,可以建索引、临时表、存储过程等数据库可以使用的技术。
网上看过纵列转横列的方法,但都不知道怎么给整进来。
数据表信息
卡信息有11万条,担保信息有10万条。两个担保人的卡有5000张,三个担保人的有3000个,四个担保人的有500个
卡信息表card
SQL code
create table card ( 卡号 varchar2(32) not null, 担保人1 varchar2(20), 担保人1证件号 varchar2(32), 担保人1电话 varchar2(20), 担保人2 varchar2(20), 担保人2证件号 varchar2(32), 担保人2电话 varchar2(20), 担保人3 varchar2(20), 担保人3证件号 varchar2(32), 担保人3电话 varchar2(20) )
担保人表guaranty
SQL code
create table guaranty ( cardno varchar2(32),--卡号 ownername varhcar2(20), -- 担保人姓名 certid varchar2(32), -- 证件号 tel varchar2(20) -- 电话 )
数据:
card
卡号,担保人1,担保人1证件号,担保人1电话,担保人2,担保人2证件号,担保人2电话,担保人3,担保人3证件号,担保人3电话
c1,null,null,null,null,null,null,null,null,null
c2,null,null,null,null,null,null,null,null,null
c3,null,null,null,null,null,null,null,null,null
c4,null,null,null,null,null,null,null,null,null
c5,null,null,null,null,null,null,null,null,null
c6,null,null,null,null,null,null,null,null,null
c7,null,null,null,null,null,null,null,null,null
c8,null,null,null,null,null,null,null,null,null
guaranty
cardno,ownername,certid,tel
c1,name1,id1,tel1
c1,name2,id2,tel2
c2,name3,id3,tel3
c2,name4,id4,tel4
c2,name5,id5,tel5
c2,name6,id6,tel6
c3,name7,id7,tel7
c4,name8,id8,tel8
希望得到最终结果:
卡号,担保人1,担保人1证件号,担保人1电话,担保人2,担保人2证件号,担保人2电话,担保人3,担保人3证件号,担保人3电话
c1,name1,id1,tel1,name2,id2,tel2,null,null,null
c2,name3,id3,tel3,name4,id4,tel4,name5,id5,tel5
c3,name7,id7,tel7,null,null,null,null,null,null
c4,name8,id8,tel8,null,null,null,null,null,null
c5,null,null,null,null,null,null,null,null,null
c6,null,null,null,null,null,null,null,null,null
c7,null,null,null,null,null,null,null,null,null
c8,null,null,null,null,null,null,null,null,null
作者: drainbow 发布时间: 2011-10-27
SQL code
guaranty--有没有列区分大小的,如同一个卡的,第1个和第2个担保人
;with b as ( select *,ROW_NUMBER()over(partition by cardno order by cardno) as row from guaranty ) update a set 担保人1=b.ownername,担保人1证件号=b.certid,担保人1电话=b.tel, 担保人2=c.ownername,担保人2证件号=c.certid,担保人2电话=c.tel, 担保人3=d.ownername,担保人3证件号=d.certid,担保人3电话=d.tel from "card" as a left join b on a.卡号=b.cardno and b.row=1 left join b as c on a.卡号=c.cardno and c.row=2 left join b as d on a.卡号=d.cardno and c.row=3
guaranty--有没有列区分大小的,如同一个卡的,第1个和第2个担保人
作者: roy_88 发布时间: 2011-10-27
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28