/*Merge into 详细介绍
MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句。
通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,
连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。
这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。 
*/

/*语法:
MERGE [INTO [schema .] table [t_alias]
USING [schema .] { table | view | subquery } [t_alias]
ON ( condition )
WHEN MATCHED THEN merge_update_clause
WHEN NOT MATCHED THEN merge_insert_clause;
*/

例子:

merge into users
using doctor
on (users.user_id = doctor.doctorid)
when matched then
update set users.user_name = doctor.doctorname
when not matched then
insert
values
(doctor.doctorid,
doctor.doctorid,
'8736F1C243E3B14941A59FF736E1B5A8',
doctor.doctorname,
sysdate,
'T',
' ',
doctor.deptid,
'b319dac7-2c5c-496a-bc36-7f3e1cc066b8');
复制代码

第二个转载:

Oracle中Merge into用法总结

起因

  前段时间,因为涉及到一张表的大数据操作,要同时进行增删改,我跟师傅想了很多优化办法,结果都不尽人意。刚开始用的就是原始算法,先更新现有记录,再插入满足要求的其他记录,最后再删除多余记录,但是少量数据还可以,10W条数据就不行了,前台的超时时间是60s,远远无法满足要求。之后又想办法将任务进行拆分,根据每条记录流水号尾字符不同进行拆分,用多个线程同时执行,一直拆分成10个任务(尾字符分别为0、1、2、3 ... 9),用十个线程同时去执行,但是时间还是很慢,最多处理13W条数据左右,50W条数据就让人无法忍受了。最后无奈只好把之前的优化全部铲掉,改为merge into操作,再做了一些优化,将50W条数据的单线程耗时缩短到三十多秒,特此,将merge into的用法总结如下:(http://blog.csdn.net/yuzhic/article/details/1896878)

  有一个表T,有两个字段a、b,我们想在表T中做Insert/Update,如果条件满足,则更新T中b的值,否则在T中插入一条记录。在Microsoft的SQL语法中,很简单的一句判断就可以了,SQL Server中的语法如下:  

if exists(select 1 from T where T.a='' )
update T set T.b=2 Where T.a=''
else
insert into T(a,b) values('',2);

Oracle中,要实现相同的功能,要用到Merge into来实现(Oracle 9i引入的功能),其语法如下:

MERGE INTO table_name alias1
USING (table|view|sub_query) alias2
ON (join condition)
WHEN MATCHED THEN
UPDATE table_name
SET col1 = col_val1,
col2 = col_val2
WHEN NOT MATCHED THEN
INSERT (column_list) VALUES (column_values);

严格意义上讲,”在一个同时存在Insert和Update语法的Merge语句中,总共Insert/Update的记录数,就是Using语句中alias2的记录数”。所以,要实现上面的功能,可以这样写:

MERGE INTO T T1
USING (SELECT '' AS a,2 AS b FROM dual) T2
ON ( T1.a=T2.a)
WHEN MATCHED THEN
UPDATE SET T1.b = T2.b
WHEN NOT MATCHED THEN
INSERT (a,b) VALUES(T2.a,T2.b);

最新文章

  1. maven jar包库
  2. [转]Java连接各种数据库的方法
  3. 算法系列:Reservoir Sampling
  4. 基于 Node.js 平台,快速、开放、极简的 web 开发框架。
  5. Spark JdbcRDD 简单使用
  6. 用Jquery load text文本到網頁遇到的問題
  7. js部分---运算符,if分支语句,for循环;switch case 的用法;
  8. swoole 异步队列
  9. move file create directory.
  10. STM8S和STM8L调试串口中断的注意点
  11. BeanUtils数据封装与表单JavaBean
  12. 认识Underscore
  13. dfs序和欧拉序
  14. 2016普及组t3海港
  15. Xamarin Layout属性(转)
  16. NeuChar 平台使用及开发教程 索引
  17. 【BZOJ3529】数表
  18. oracle查询语句查询增加一列内容
  19. SQLServer------基本操作
  20. 解决远程登陆Linux误按ctrl+s锁屏

热门文章

  1. Provider Hosted App中使用JOM问题
  2. Android 视频播放器,在线播放
  3. RecyclerView的下拉刷新和加载更多 动画
  4. CoreLocation 定位
  5. Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at localhost are already in use.解决办法
  6. 【读书笔记】iOS网络-三种错误
  7. Oc中的数组
  8. [gist]在浏览器里免查看源代码格式化var_dump输出
  9. js实现页面跳转的几种方式
  10. Access restriction: The type 'RSACipher' is not API