首页 两表(多表)关联update[精彩]

两表(多表)关联update[精彩]

举报
开通vip

两表(多表)关联update[精彩]两表(多表)关联update[精彩] 两表(多表)关联update 两表(多表)关联update.txt28生活是一位睿智的长者,生活是一位博学的老师,它常常春风化雨,润物无声地为我们指点迷津,给我们人生的启迪。不要吝惜自己的爱,敞开自己的胸怀,多多给予,你会发现,你也已经沐浴在了爱河里。两表(多表)关联update -- 仅在where字句中的连接 --这次提取的数据都是VIP,且包括新增的,所以顺便更新客户类别 update customers a -- 使用别名 set customer_type='0...

两表(多表)关联update[精彩]
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf (多表)关联update[精彩] 两表(多表)关联update 两表(多表)关联update.txt28生活是一位睿智的长者,生活是一位博学的老师,它常常春风化雨,润物无声地为我们指点迷津,给我们人生的启迪。不要吝惜自己的爱,敞开自己的胸怀,多多给予,你会发现,你也已经沐浴在了爱河里。两表(多表)关联update -- 仅在where字句中的连接 --这次提取的数据都是VIP,且包括新增的,所以顺便更新客户类别 update customers a -- 使用别名 set customer_type='01' --01 为vip,00为普通 where exists (select 1 from tmp_cust_city b where b.customer_id=a.customer_id ) 3) 两表(多表)关联update -- 被修改值由另一个表运算而来 update customers a -- 使用别名 set city_name=(select b.city_name from tmp_cust_city b where b.customer_id=a.customer_id) where exists (select 1 from tmp_cust_city b where b.customer_id=a.customer_id ) -- update 超过2个值 update customers a -- 使用别名 set (city_name,customer_type)=(select b.city_name,b.customer_type from tmp_cust_city b where b.customer_id=a.customer_id) where exists (select 1 from tmp_cust_city b where b.customer_id=a.customer_id ) 注意在这个语句中, =(select b.city_name,b.customer_type from tmp_cust_city b where b.customer_id=a.customer_id ) 与 (select 1 from tmp_cust_city b where b.customer_id=a.customer_id ) 是两个独立的子查询,查看执行计划可知,对b表/索引扫描了 2篇; 如果舍弃where条件,则默认对A表进行全表 更新,但由于(select b.city_name from tmp_cust_city b where where b.customer_id=a.customer_id) 有可能不能提供"足够多"值,因为tmp_cust_city只是一部分客 户的信息, 所以报错(如果指定的列--city_name可以为NULL则另当别论): 01407, 00000, "cannot update (%s) to NULL" // *Cause: // *Action: 一个替代的方法可以采用: update customers a -- 使用别名 set city_name=nvl((select b.city_name from tmp_cust_city b where b.customer_id=a.customer_id),a.city_name) 或者 set city_name=nvl((select b.city_name from tmp_cust_city b where b.customer_id=a.customer_id),'未知') -- 当然这不符合业务逻辑了 4) 上述3)在一些情况下,因为B表的纪录只有A表的20-30%的纪录数, 考虑A表使用INDEX的情况,使用cursor也许会比关联update带来更好的性能: set serveroutput on declare cursor city_cur is select customer_id,city_name from tmp_cust_city order by customer_id; begin for my_cur in city_cur loop update customers set city_name=my_cur.city_name where customer_id=my_cur.customer_id; /** 此处也可以单条/分批次提交,避免锁表情况 **/ -- if mod(city_cur%rowcount,10000)=0 then -- dbms_output.put_line('----'); -- commit; -- end if; end loop; end; 5) 关联update的一个特例以及性能再探讨 在oracle的update语句语法中,除了可以update表之外,也 可以是视图,所以有以下1个特例: update (select a.city_name,b.city_name as new_name from customers a, tmp_cust_city b where b.customer_id=a.customer_id ) set city_name=new_name 这样能避免对B表或其索引的2次扫描,但前提是 A(customer_id) b(customer_id)必需是unique index 或primary key。否则报错: 01779, 00000, "cannot modify a column which maps to a non key-preserved table" // *Cause: An attempt was made to insert or update columns of a join view which // map to a non-key-preserved table. // *Action: Modify the underlying base tables directly. 6)oracle另一个常见错误 回到3)情况,由于某些原因,tmp_cust_city customer_id 不是 唯一index/primary key update customers a -- 使用别名 set city_name=(select b.city_name from tmp_cust_city b where b.customer_id=a.customer_id) where exists (select 1 from tmp_cust_city b where b.customer_id=a.customer_id ) 当对于一个给定的a.customer_id (select b.city_name from tmp_cust_city b where b.customer_id=a.customer_id) 返回多余1条的情况,则会报如下错误: 01427, 00000, "single-row subquery returns more than one row" // *Cause: // *Action: 一个比较简单近似于不负责任的做法是 update customers a -- 使用别名 set city_name=(select b.city_name from tmp_cust_city b where b.customer_id=a.customer_id) 如何理解 01427 错误,在一个很复杂的多表连接update的语 句,经常因考虑不周,出现这个错误, 仍已上述例子来描述,一个比较简便的方法就是将A表代入 值 表达式 中,使用group by 和 having 字句查看重复的纪录 (select b.customer_id,b.city_name,count(*) from tmp_cust_city b,customers a where b.customer_id=a.customer_id group by b.customer_id,b.city_name having count(*)>=2 )
本文档为【两表(多表)关联update[精彩]】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_477730
暂无简介~
格式:doc
大小:20KB
软件:Word
页数:0
分类:生活休闲
上传时间:2018-04-28
浏览量:10