ORACLE多表关联/联表批量更新数据

CASE: 表一 新增字段 AGE, 需要从 表二中 将AGE数据同步到表一中, 或者 单纯同步两张表中的数据

表1:EMPLOYEE(被更新的表 字段 age )

表2: T_USER 数据来源表

方法一: 使用 exists

只更新表1中 age 为null的数据

UPDATE t_target E SET AGE = (SELECT U.AGE FROM t_source U WHERE E.ID=U.ID )  WHERE EXISTS (SELECT 1 FROM t_source U WHERE E.ID=U.ID AND E.AGE IS NULL )

更新表1全部数据

UPDATE t_target E SET AGE = (SELECT U.AGE FROM t_source U WHERE E.ID=U.ID )  WHERE EXISTS (SELECT 1 FROM t_source U WHERE E.ID=U.ID)

方法二: 与方法一类似, 使用 in

UPDATE t_target E SET AGE = (SELECT U.AGE FROM t_source U WHERE E.ID=U.ID )  WHERE E.ID IN (SELECT ID FROM t_source) AND E.AGE IS NULL

方法三: 使用 merge into

更新一个字段:

MERGE INTO t_target E USING t_source U ON (E.ID=U.ID ) WHEN MATCHED THEN UPDATE SET E.AGE=U.AGE WHERE E.AGE IS NULL

更新多个字段:

MERGE INTO t_target E USING t_source U ON (E.ID=U.ID ) WHEN MATCHED THEN UPDATE SET E.AGE=U.AGE,E.NAME=U.NAME

方法四: 快速游标

BEGIN
 FOR CUR IN (
 SELECT U.ID,U.NAME,U.AGE FROM t_source U,t_target E WHERE U.ID=E.ID
 )LOOP
 UPDATE t_target E SET E.NAME= CUR.NAME,E.AGE=CUR.AGE WHERE E.ID=CUR.ID;
 END LOOP;
END;

五:使用merge into可能会遇到的问题

新建两张table :test_source和test_target,他们的数据分别如下:

select * from test_source;
NAME ID
P3 74834
P4 74835
luo 8
P1 74832
P2 74833
zhi 8

select name ,id from test_target;
NAME ID
P3_new 74834
P4_new 74835
luo_new 8
P1_new 74832
P2_new 74833
zhi 8

merge into test_target
using test_source
on (test_source.id = test_target.id)
when matched then update set test_target.name = test_source.name
when not matched then insert values(test_source.name,test_source.id);
using test_source

​ *
第 2 行出现错误:
ORA-30926: 无法在源表中获得一组稳定的行
---------------------哈哈,报错了,大家想想为什么呢?-----------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

解答如下:

首先我们要知道merge into存在的意义是什么!!!
   使用merge into是为了根据匹配条件on(condition)利用table_source 的数据更新合并table_target的数据。
merge into的内部处理是将table_source的每一条记录和table_target的每一条记录对比匹配,匹配到符合条件的记录就会进行修改,匹配不到的话就会insert。如果table_source的匹配列中有重复值的话,等到第二次重复的列值匹配的时候,就会将第一次的update后的值再一次update,就是说合并后的table_target中会丢失在table_source中的记录!!!如果记录丢失的话,两表合并的意义何在?!!因此我们使用merge into要注意:源表匹配列中不能有重复值,否则无法匹配(报错!   )。 

-------------------------------------------我们可以上面将重复的列值去掉试试: -------------------------------------------

delete from test_source where name = 'zhi';

已删除 1 行。

merge into test_target
using test_source
on (test_source.id = test_target.id)
when matched then update set test_target.name = test_source.name
when not matched then insert values(test_source.name,test_source.id);

行已合并,成功执行

---------------这回就何合并成功了。

原文链接:Fire_Bit的博客 逸天飞云的博客

本文作者:Journey&Flower

本文链接:https://www.cnblogs.com/JourneyOfFlower/p/16803129.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Journey&Flower  阅读(4532)  评论(0编辑  收藏  举报
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示
  1. 1 404 Not Found REOL
  2. 2 白色恋人 游鸿明
  3. 3 盛夏的果实 莫文蔚
  4. 4 以父之名 周杰伦
  5. 5 晴天 周杰伦
  6. 6 简单爱 周杰伦
  7. 7 东风破 周杰伦
  8. 8 稻香 周杰伦
  9. 9 爱在西元前 周杰伦
  10. 10 千里之外 费玉清-周杰伦
  11. 11 偏爱 张芸京
  12. 12 大海 张雨生
  13. 13 月亮惹的祸 张宇
  14. 14 雨一直下 张宇
  15. 15 过火 张信哲
  16. 16 隐形的翅膀 张韶涵
  17. 17 天下 张杰
  18. 18 当你孤单你会想起谁 张栋梁
  19. 19 清明雨上 许嵩
  20. 20 玫瑰花的葬礼 许嵩
  21. 21 断桥残雪 许嵩
  22. 22 城府 许嵩
  23. 23 等一分钟 徐誉滕
  24. 24 客官不可以 徐良_小凌
  25. 25 坏女孩 徐良_小凌
  26. 26 犯贱 徐良
  27. 27 菠萝菠萝蜜 谢娜
  28. 28 贝多芬的悲伤 萧风
  29. 29 睫毛弯弯 王心凌
  30. 30 我不是黄蓉 王蓉
  31. 31 秋天不回来 王强
  32. 32 今天你要嫁给我 陶喆,蔡依林
  33. 33 丁香花 唐磊
  34. 34 绿光 孙燕姿
  35. 35 求佛 誓言
  36. 36 十一年 邱永传
  37. 37 下辈子如果我还记得你 马郁
  38. 38 一千年以后 林俊杰
  39. 39 江南 林俊杰
  40. 40 曹操 林俊杰
  41. 41 背对背拥抱 林俊杰
  42. 42 会呼吸的痛 梁静茹
  43. 43 勇气 梁静茹
  44. 44 爱你不是两三天 梁静茹
  45. 45 红日 李克勤
  46. 46 星月神话 金莎
  47. 47 嘻唰唰 花儿乐队
  48. 48 穷开心 花儿乐队
  49. 49 六月的雨-《仙剑奇侠传》电视剧插曲 胡歌
  50. 50 一个人的寂寞两个人的错 贺一航
  51. 51 好想好想-《情深深雨濛濛》电视剧片尾曲 古巨基
  52. 52 情人 刀郎
  53. 53 冲动的惩罚 刀郎
  54. 54 西海情歌 刀郎
  55. 55 2002年的第一场雪 刀郎
  56. 56 红玫瑰 陈奕迅
  57. 57 浮夸 陈奕迅
  58. 58 爱情转移 陈奕迅
  59. 59 独家记忆 陈小春
  60. 60 记事本 陈慧琳
  61. 61 看我72变 蔡依林
  62. 62 寂寞在唱歌 阿桑
  63. 63 樱花草 Sweety
  64. 64 中国话 S.H.E
  65. 65 波斯猫 S.H.E
  66. 66 杀破狼-《仙剑奇侠传》电视剧片头曲 JS
  67. 67 Lydia F.I.R.
  68. 68 I Miss You 罗百吉_青春美少女.
白色恋人 - 游鸿明
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 林利南

作曲 : 游鸿明

编曲 : 涂惠源

冷空气 却清晰

你在南极冰山雪地里

极光中雪白的肌肤

是哀愁是美丽

为了要遇见你

我连呼吸都反复练习

兰伯特仁慈的冰川

带领我走向你

零下九十一度的酷寒

滚滚红尘千年的呼喊

藏在沃斯托克的湖岸

沉寂轻叹

撒哈拉漫天狂沙 金字塔谁能解答

兵马俑谁与争锋 长城万里相逢

人世间悲欢聚散 一页页写在心上

含着泪白色恋人 却有灰色的年轮

零下九十一度的酷寒

滚滚红尘千年的呼喊

藏在沃斯托克的湖岸

沉静轻叹

撒哈拉漫天狂沙 金字塔谁能解答

兵马俑谁与争锋 长城万里相逢

人世间悲欢聚散 一页页写在心上

含着泪白色恋人 却有灰色的年轮

撒哈拉漫天狂沙 金字塔谁能解答

兵马俑谁与争锋 长城万里相逢

人世间悲欢聚散 一页页写在心上

含着泪白色恋人 却有灰色的年轮