+ -
当前位置:首页 → 问答吧 → 十万条记录,求高效更新SQL

十万条记录,求高效更新SQL

时间:2011-10-27

来源:互联网

卡和担保人之间1对多关系,现在要把3个担保人信息guaranty放入卡信息表card中。对于超过3个担保人的卡随机取3个担保人信息既可。

现在的处理方式是写了个存储过程,定义两个游标,分别是卡和担保人,取出每张卡信息,再根据卡号查到担保人,然后写入卡信息表。但这样效率很低,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
;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