Oracle 更新相同表问题


  1. 描述:ta,tb两表的结构完全相同,现在想要以tb中的数据去更新ta表,   
  2. 要求:以ta为准,若ta中没有的数据,将tb中的数据完全合并到ta中;   
  3.       若ta中有的数据,但不完全,一些字段为空,那么将tb中相同id的字段去更新ta表,   
  4. --   
  5. 方法一:用全连接,结合nvl函数:   
  6. with ta as(   
  7.      select 1 id, 23 age, 'lilei' name, 'ddd@126.com' mail from dual union all    
  8.      select 2, null'hanmeimei',null from dual union all    
  9.      select 3, 23, null'jim eee@153.com' from dual union all    
  10.      select 4, 22, 'tom',null from dual),   
  11.      tb as(   
  12.      select 1 id, 23 age, 'lilei' name, 'bbb@126.com' mail from dual union all    
  13.      select 2, 25, 'hanmeimei''fff@124com' from dual union all   
  14.      select 5, 27, 'green''ejorj@125.com' from dual)   
  15. select nvl(ta.id,tb.id) id,   
  16.        nvl(ta.age,tb.age) age,   
  17.        nvl(ta.name,tb.name) name,   
  18.        nvl(ta.mail,tb.mail) mail   
  19. from ta full join tb    
  20. on ta.id=tb.id   
  21. order by id;   
  22.         ID        AGE NAME      MAIL   
  23. ---------- ---------- --------- ---------------   
  24.          1         23 lilei     ddd@126.com   
  25.          2         25 hanmeimei fff@124com   
  26.          3         23           jim eee@153.com   
  27.          4         22 tom          
  28.          5         27 green     ejorj@125.com   
  29. --   
  30. 方法二:使用merge into合并:   
  31. create table ta(id varchar2(2),age number(3),name varchar2(10),mail varchar2(30));   
  32. select * from ta;   
  33. ID  AGE NAME       MAIL   
  34. -- ---- ---------- ------------------------------   
  35. 1    23 lilei      ddd@126.com   
  36. 2       hanmeimei     
  37. 3    23 jim        eee@153.com   
  38. 4    22 tom    
  39. --   
  40. create table tb as select * from ta where 1=0;   
  41. select * from tb;   
  42. ID  AGE NAME       MAIL   
  43. -- ---- ---------- ------------------------------   
  44. 1    23 lilei      bbb@126.com   
  45. 2    25 hanmeimei  fff@124.com   
  46. 5    27 green      ejorj@125.com   
  47. --   
  48. merge into ta   
  49. using tb on (ta.id=tb.id)   
  50. when matched then   
  51. update set    
  52.        age=COALESCE(ta.age,tb.age),   
  53.        name=COALESCE(ta.name,tb.name),   
  54.        mail=COALESCE(ta.mail,tb.mail)   
  55. when not matched then   
  56. insert(ta.id,ta.age,ta.name,ta.mail)   
  57. values(tb.id,tb.age,tb.name,tb.mail);   
  58. --   
  59. ID  AGE NAME       MAIL   
  60. -- ---- ---------- ------------------------------   
  61. 1    23 lilei      ddd@126.com   
  62. 2    25 hanmeimei  fff@124.com   
  63. 3    23 jim        eee@153.com   
  64. 4    22 tom           
  65. 5    27 green      ejorj@125.com   
  66. --   
  67. 方法三:使用update直接更新ta表,若ta中没有的数据,将tb中的数据添加进来即可:   
  68.   3.1 更新   
  69.   update ta a   
  70.   set (a.age,a.name,a.mail)=(   
  71.        select nvl(a1.age,b1.age),   
  72.               nvl(a1.name,b1.name),   
  73.               nvl(a1.mail,b1.mail)   
  74.               from ta a1,tb b1   
  75.               where a1.id=b1.id and a1.id=a.id)   
  76.   where exists (select 1 from ta a2 where a2.id=a.id);   
  77.   //注意:此方法失败,如果您能想到解决办法,请赐教   
  78.   3.2 添加   
  79.   insert into ta(id,age,name,mail)   
  80.   select tb.id,tb.age,tb.name,tb.mail   
  81.   from tb   
  82.   where tb.id not in(select ta.id from ta);  

相关内容