Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 990|回复: 5

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

[复制链接]

该用户从未签到

发表于 2011-10-31 13:01:01 | 显示全部楼层 |阅读模式
卡和担保人之間1对多关xi,现在要把3个担保人信xiguaranty放ru卡信息表card中。对于超過3个danbao人的卡随机qu3个担保人信xi既可。

现在的处理方shi是写了个存储过程,定义两個游biao,分别是卡和dan保人,取出每张卡信息,再根ju卡号查到担保ren,然后寫入卡信xi表。但这样xiao率很低,3个小时只更xin了15000条。
qiu高xiao方fa,可以建索引、临时表、存儲过程等数据库可以使用的技术。

网上看过纵列zhuan横lie的方fa,但都不知道怎么给整进来。

数据表信xi
卡Xin息有11萬条,danbao信息2you10万條。两个担保人的卡有5000张,三个dan保人的有3000个,四个担保人的you500個

卡Xin息表card
SQL code create table card (
卡号 varchar2(32) not null,
担保人1 varchar2(20),
擔保ren1证件hao varchar2(32),
担保ren1电hua varchar2(20),
担保人2 varchar2(20),
担保人2证件号 varchar2(32),
担保人2电话 varchar2(20),
dan保人3 varchar2(20),
擔保人3证件号 varchar2(32),
担保人3电話 varchar2(20)
)


担bao人表guaranty
SQL code create table guaranty (
cardno varchar2(32),--卡hao
ownername varhcar2(20), -- 担bao人姓ming
certid varchar2(32), -- 证件号
tel varchar2(20) -- 电话
)


数据:  
card
卡號,担保人1,擔bao人1证件號,担保人1电話,担保人2,擔保人2证件号,擔保人2電话,dan保人3,担bao人3zhengjian号,担保人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

xi望得到zui終结果:
卡号,担保人1,擔保ren1证件号,担保人1電话,擔bao人2,担baoren2zheng件号,担保人2dianhua,擔保ren3,担保人3zheng件號,dan保人3dian话
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

欢迎来到Java学習者论坛,转載请注明地址:http://www.javaxxz.com.
回复

使用道具 举报

该用户从未签到

发表于 2011-10-31 13:01:04 | 显示全部楼层

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

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个担保人
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-31 13:01:09 | 显示全部楼层

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

通過视图方式更新,分3次执行,分别填充担保人1、2、3的數据。
SQL code
UPDATE
  (SELECT *
     FROM
         (SELECT GUARANTY.*,ROW_NUMBER() OVER(PARTITION BY CARDNO)RN FROM GUARANTY ) A,
         CARD
   WHERE A.RN = 1 AND CARD.CARDNO = A.CARDNO)
SET CARD.担保人1 = A.OWNERNAME,
    CARD.擔保人1证件号 = A.CERTID,
    CARD.担保人1电話 = A.TEL;



SQL code
UPDATE
  (SELECT *
     FROM
         (SELECT GUARANTY.*,ROW_NUMBER() OVER(PARTITION BY CARDNO)RN FROM GUARANTY ) A,
         CARD
   WHERE A.RN = 2 AND CARD.CARDNO = A.CARDNO)
SET CARD.担保人2 = A.OWNERNAME,
    CARD.担保人2证件号 = A.CERTID,
    CARD.担保人2电话 = A.TEL;



SQL code
UPDATE
  (SELECT *
     FROM
         (SELECT GUARANTY.*,ROW_NUMBER() OVER(PARTITION BY CARDNO)RN FROM GUARANTY ) A,
         CARD
   WHERE A.RN = 3 AND CARD.CARDNO = A.CARDNO)
SET CARD.担保人3 = A.OWNERNAME,
    CARD.担保人3证件号 = A.CERTID,
    CARD.担保人3電话 = A.TEL;
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-31 13:01:14 | 显示全部楼层

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

SQL code
create table tmp_guaranty
as
select cardno as "卡号",
              max(case when isort = 1 then cardno else null end) as "擔保人1",
              max(case when isort = 1 then certid else null end) as "擔保人1证件号",
              max(case when isort = 1 then tel else null end) as "担保人1電话",
              max(case when isort = 2 then cardno else null end) as "担保人2",
              max(case when isort = 2 then certid else null end) as "担保人2證件号",
              max(case when isort = 2 then tel else null end) as "擔保人2电話",
              max(case when isort = 3 then cardno else null end) as "擔保人3",
              max(case when isort = 3 then certid else null end) as "担保人3證件号",
              max(case when isort = 3 then tel else null end) as "担保人3电话"
         from (select t.*, row_number() over(partition by cardno order by certid) as isort from guaranty t)
        where isort <= 3
        group by cardno;

merge into card a
using tmp_guaranty b
   on (a.卡号 = b.卡号)
when matched then
update set a.担保人1 =        b.担保人1,
           a.担保人1證件号 =  b.担保人1证件号,
           a.担保人1电话 =    b.担保人1電話,
           a.担保人2 =        b.担保人2,
           a.担保人2证件号 =  b.担保人2证件号,
           a.担保人2电话 =    b.担保人2電话,
           a.担保人3 =        b.担保人3,
           a.担保人3证件号 =  b.擔保人3證件号,
           a.担保人3电话 =    b.担保人3电话;
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-31 13:01:19 | 显示全部楼层

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

SQL code
create table new_card
as
select c.卡号,
       g.担保人1, g.擔保人1证件号, g.担保人1電話,
       g.担保人2, g.擔保人2证件号, g.担保人2电話,
       g.担保人3, g.担保人3证件号, g.擔保人3电话
  from card c,
       (select cardno as "卡号",
               max(case when isort = 1 then cardno else null end) as "担保人1",
               max(case when isort = 1 then certid else null end) as "担保人1证件号",
               max(case when isort = 1 then tel else null end) as "担保人1电话",
               max(case when isort = 2 then cardno else null end) as "担保人2",
               max(case when isort = 2 then certid else null end) as "担保人2证件号",
               max(case when isort = 2 then tel else null end) as "担保人2电话",
               max(case when isort = 3 then cardno else null end) as "担保人3",
               max(case when isort = 3 then certid else null end) as "担保人3证件号",
               max(case when isort = 3 then tel else null end) as "担保人3电話"
          from (select t.*, row_number() over(partition by cardno order by certid) as isort from guaranty t)
         where isort <= 3
         group by cardno) g
where c.卡號 = g.卡號;

rename card to card_bak;
rename new_card to card;
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-31 13:01:26 | 显示全部楼层

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

才10万条记录就解决不了了?
我做了下测试我在虚拟机里30万条记录更新也就几分钟而已,用特殊方法2分鐘就搞定了
sql语句上面都给得很全
但方法都基本就两種,
第一。根据guaranty表构造出一个card子表
利用card子表与card表關联來更新card表
第二。根據guaranty表 利用create table as select 语句建一个新的card表,然后将新card表改名
针对这两种方法操作难度根据你对你的库的熟悉度和oracle熟悉程度来采用
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-21 19:13 , Processed in 0.485564 second(s), 47 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表