oracle 更新相同表问题
2011-04-19 17:37
29 查看
描述: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 all select 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) mail from ta full join tb on ta.id=tb.id order by id; ID AGE NAME MAIL ---------- ---------- --------- --------------- 1 23 lilei ddd@126.com 2 25 hanmeimei fff@124com 3 23 jim eee@153.com 4 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.com 2 hanmeimei 3 23 jim eee@153.com 4 22 tom -- create table tb as select * from ta where 1=0; select * from tb; ID AGE NAME MAIL -- ---- ---------- ------------------------------ 1 23 lilei bbb@126.com 2 25 hanmeimei fff@124.com 5 27 green ejorj@125.com -- merge into ta using tb on (ta.id=tb.id) when matched then update set age=COALESCE(ta.age,tb.age), name=COALESCE(ta.name,tb.name), mail=COALESCE(ta.mail,tb.mail) when not matched then insert(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.com 2 25 hanmeimei fff@124.com 3 23 jim eee@153.com 4 22 tom 5 27 green ejorj@125.com -- 方法三:使用update直接更新ta表,若ta中没有的数据,将tb中的数据添加进来即可: 3.1 更新 update ta a set (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 b1 where 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.mail from tb where tb.id not in(select ta.id from ta);
原帖:http://topic.csdn.net/u/20110419/02/5fd87b61-9994-4340-860b-d0bb5ad11adf.html
相关文章推荐
- 关于ORACLE的UPDATE更新多表的问题
- oracle update 更新表的问题
- ORACLE学习问题记录(不断更新)
- Oracle sales 会计日历和汇率的更新问题
- ORACLE问题收集(或者说针对MS-SQL的不同点)--2011年3月16日更新
- Windows Server 2012更新补丁后导致Micosoft ODBC for Oracle出现问题
- Oracle 11g RAC 本地时间和通过listener连接时间不相同的问题
- oracle中sql小问题,不断更新
- ORACLE多表查询更新问题
- Glide加载相同URL时由于缓存无法更新图片的问题
- 使用oracle中遇到的各种问题【持续更新】
- Oracle pl/sql导入sql文件,插入更新数据,中文乱码问题解决方案
- Linux--14:ubuntu12.04 vi不能正常使用、右上角出现红杠提醒更新出问题、网速比相同条件下windows下慢 解决方法
- ajax提交相同url,重复发送请求后台,页面无更新的问题解决
- oracle的一些小问题集锦(不断更新)
- 实时更新oracle需要注意的问题
- Oracle 丢失更新问题的解决方案
- 使用Oracle sys_guid()生成的ID更新列值时遇到的一个问题
- Activiti+oracle 启动项目时不能自动建表或更新表的问题分析及解决办法
- 频繁更新Oracle表更新速度问题解决