设为首页 收藏本站
查看: 1123|回复: 0

[经验分享] oracle 更新相同表问题

[复制链接]

尚未签到

发表于 2016-7-19 04:28:18 | 显示全部楼层 |阅读模式
  描述:ta,tb两表的结构完全相同,现在想要以tb中的数据去更新ta表,要求:以ta为准,若ta中没有的数据,将tb中的数据完全合并到ta中;若ta中有的数据,但不完全,一些字段为空,那么将tb中相同id的字段去更新ta表,--方法一:用全连接,结合nvl函数:with ta as(select 1 id, 23 age, 'lilei' name, 'ddd@126.com' mail from dual union all select 2, null, 'hanmeimei',null from dual union all select 3, 23, null, 'jim eee@153.com' from dual union all select 4, 22, 'tom',null from dual),tb as(select 1 id, 23 age, 'lilei' name, 'bbb@126.com' mail from dual union all select 2, 25, 'hanmeimei', 'fff@124com' from dual union allselect 5, 27, 'green', 'ejorj@125.com' from dual)select nvl(ta.id,tb.id) id,nvl(ta.age,tb.age) age,nvl(ta.name,tb.name) name,nvl(ta.mail,tb.mail) mailfrom ta full join tb on ta.id=tb.idorder by id;ID        AGE NAME      MAIL---------- ---------- --------- ---------------1         23 lilei     ddd@126.com2         25 hanmeimei fff@124com3         23           jim eee@153.com4         22 tom       5         27 green     ejorj@125.com--方法二:使用merge into合并:create table ta(id varchar2(2),age number(3),name varchar2(10),mail varchar2(30));select * from ta;ID  AGE NAME       MAIL-- ---- ---------- ------------------------------1    23 lilei      ddd@126.com2       hanmeimei  3    23 jim        eee@153.com4    22 tom --create table tb as select * from ta where 1=0;select * from tb;ID  AGE NAME       MAIL-- ---- ---------- ------------------------------1    23 lilei      bbb@126.com2    25 hanmeimei  fff@124.com5    27 green      ejorj@125.com--merge into tausing tb on (ta.id=tb.id)when matched thenupdate set age=COALESCE(ta.age,tb.age),name=COALESCE(ta.name,tb.name),mail=COALESCE(ta.mail,tb.mail)when not matched theninsert(ta.id,ta.age,ta.name,ta.mail)values(tb.id,tb.age,tb.name,tb.mail);--ID  AGE NAME       MAIL-- ---- ---------- ------------------------------1    23 lilei      ddd@126.com2    25 hanmeimei  fff@124.com3    23 jim        eee@153.com4    22 tom        5    27 green      ejorj@125.com--方法三:使用update直接更新ta表,若ta中没有的数据,将tb中的数据添加进来即可:3.1 更新update ta aset (a.age,a.name,a.mail)=(select nvl(a1.age,b1.age),nvl(a1.name,b1.name),nvl(a1.mail,b1.mail)from ta a1,tb b1where a1.id=b1.id and a1.id=a.id)where exists (select 1 from ta a2 where a2.id=a.id);//注意:此方法失败,如果您能想到解决办法,请赐教3.2 添加insert into ta(id,age,name,mail)select tb.id,tb.age,tb.name,tb.mailfrom tbwhere tb.id not in(select ta.id from ta);
  原帖:http://topic.csdn.net/u/20110419/02/5fd87b61-9994-4340-860b-d0bb5ad11adf.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-245982-1-1.html 上篇帖子: oracle 根据行列号取值 下篇帖子: oracle alter table详解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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