Wednesday, November 22

Oracle merge-statement

The merge statement has been in Oracle since version 9, but is still not very widely used.
When looking at data loading and merging code I think the most common bit of PL/SQL I've seen is the "merge" statement written in pl with slow and boring if-statements to see check if an entity exists in a table and if it exists the pl-code will do an update, otherwise it will do an insert.
Two words, super slow.

A much better solution is to use the merge-statement which does exactly that, it's basically
"if exists then update else insert". Merge data from one data entity to another.
The basic concept is sort of a join between the loading entity and the destination table.
You can load from a normal table or from select query.

Example:
SQL> select * from emp_load;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- --------- ----- -------- ----------
7654 MARTIN SALESMAN 7698 28-SEP-81 1450 1400 30
7788 SCOTT ANALYST 7566 19-APR-87 3500 20
7902 FORD SALESMAN 7698 03-DEC-81 3000 1300 20
7100 CHARLES CLERK 7788 22-NOV-06 1150 10
7302 SALLY CLERK 7902 22-NOV-06 1300 30

SQL> MERGE INTO emp e USING emp_load l
ON (e.empno=l.empno)
WHEN MATCHED THEN
UPDATE SET
e.ename = l.ename,
e.job = l.job,
e.mgr = l.mgr,
e.hiredate = l.hiredate,
e.sal = l.sal,
e.comm = l.comm,
e.deptno = l.deptno
WHEN NOT MATCHED THEN
INSERT VALUES (
l.empno, l.ename, l.job,
l.mgr, l.hiredate,
l.sal, l.comm, l.deptno
)
/

5 rows merged.

SQL> select * from emp;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- --------- ----- -------- ----------
7100 CHARLES CLERK 7788 22-NOV-06 1150 10
7302 SALLY CLERK 7902 22-NOV-06 1300 30

7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1450 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3500 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD SALESMAN 7698 03-DEC-81 3000 1300 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10

16 rows selected.
If you want to load from a query you can use this syntax:
MERGE INTO emp e USING 
(select * from emp_load
where hiredate > sysdate - 7
) l
ON (e.empno=l.empno)
...
Check out the merge docs .

16 comments:

Laura said...

Thanks--very helpful! I was toying with the idea of doing a pure delete/re-insert, but I think a MERGE may be faster for the amount of data I'm handling, after reading your entry. Thanks again.

Jack H. said...

How does this work with large volumes of data? Or is the following better for large amounts of data:


truncate some_table;
insert into some_table as
select *
from other_table;

Jeff said...

Very insightful and practical advice.

A couple observations for Oracle loading from experience in a VLDB installation.

You can use Oracle External Tables combined with MERGE and/or INSERT to easily load data from a flat file external source. Breaking up the data into multiple data files referenced by the external table will allow Oracle to read them in parallel.

I've found that MERGE can be slow if your table has a large number of indexes. Periodic reordering of the PK and ordering of the data to load by PK will help with large volumes.

In some cases with large tables and you're changing more than 20% of the records it can actually be faster to create a new table and then flip the table-names to put the new table into production.

eian said...

can you do an update if it doesnt match then ignore if it matches?

cheers

alanjstr said...

Merge works great if you're doing an insert/update, but what if I have A0abc and I need to result in A1def and A2ghi where my key is A#? In other words, how can I tell it to delete the key that didn't match, without it affecting B#?

Daniel N said...

eian, yes, you can use both the "WHEN MATCHED..." and the "WHEN NOT MATCHED..." statements or either one of them by themselves.

Paras Jethwani (Melbourne) said...

Nice article, especially the one line summary of the MERGE statement

"if exists then update else insert"

Pramod said...

how to merge records of datatable and physical database table from c#.net.
One idea is first create a temp table and insert records of datatable, then apply merge statement on temp table and physical database table.
but i don't want to create temp table.
I have a very large table consist millions records.


Any idea...
Thanks in advance..
~pramod

PerlDev said...

Pramod, did you find a solution yet? -PD

Stew said...

Thanks for this example. I had never noticed the USING clause in any other examples, so never could get it to work.

Thought that may say more about my reading skills than your example??? :-/

潇洒光头、 said...

●●百度类●●:
代孕 淘宝刷信用
北京发票 代开发票
餐饮发票 住宿发票
广告发票 对讲机
传世私服 传奇世界私服
新开传世私服 传奇私服
天龙八部私服 天龙私服
苏州办证
手机窃听器 手机窃听器
手机窃听器
手机监听器
手机监听器
手机窃听器
代写论文 代写论文
北京办证 办证
代孕 代孕网
代孕 代孕
代孕 试管婴儿
代写论文 代写论文
代写代发 论文代写 dhl

●●Google类●●:
modern abstract art sofa manufacturer
净水器 开水器 净水机 净水 软水机 软水 直饮机 家用净水 家用净水器 家用净水机 中央净水 中央净水器 水家装 水家电 水卫士 混合机
过滤机 DHL快递 俄罗斯签证
保险箱 法兰 法兰标准
polycarbonate sheet 回流焊 波峰焊
免烧砖机 注册上海公司 儿童摄影
牛皮癣 皮肤病 制氮机
食堂售餐机 校园一卡通
学校一卡通 ic卡售饭机
食堂售饭机 深圳一卡通
广东售饭机 机电设备安装
北京发票 代开发票
餐饮发票 住宿发票
广告发票
网络电话 免费网络电话
假发 补发
织发 植发
压滤机 板框压滤机
蒸馏水机 纯蒸气发生器
上海搬家公司 上海搬场公司
大众搬家 大众搬场
张家界旅游 香港旅游
深圳旅行社 打包机
收缩机 对讲机 电源模块
血管栓塞剂
售饭机 水控机 水控器
萎缩性胃炎 neoprene laptop bags
SEO优化
SEO优化 计量泵
胃炎 胃病
冷水机 冰水机
工业冷水机
北京特价机票 北京打折计票 北京国际机票
北京机票预定 北京飞机票
北京订机票 北京机票查询 饮料机械
血糖仪 血糖仪
银杏 水培花卉 企业宣传片 空分设备
化工泵 离心机
电话交换机 程控交换机 集团电话 集装袋
混合机 混合机
混合机捏合机 捏合机
捏合机导热油炉 导热油炉
导热油炉 反应釜 反应釜
反应釜 spherical roller bearing
搬运车 搬运车 电动搬运车 油桶搬运车 堆高车 电动堆高车 半电动堆高车 堆垛车
高空作业平台车 电动叉车 平衡重叉车 前移叉车 电瓶叉车
韩国饰品批发 模块电源
X架 超薄灯箱> 易拉宝 展柜制作
代理服务器 游戏加速器 网络加速器
网通加速器 电信加速器 电信网通转换器
电信网通加速器 网通电信互转
网通电信互通 网络游戏加速器
美国VPN代理 美国独享VPN 美国独享IP
pvc ceiling panel Spherical roller bearings
SEO优化
安全鞋 劳保鞋 防砸鞋 电绝缘鞋 上海安全鞋 上海劳保鞋 江苏劳保鞋
服装软件 服装管理软件 进销存软件
进销存管理软件 服装管理系统 服装进销存软件
进销存系统 进销存管理系统 免费进销存软件
吉林中医 东北特产
打包机
阳痿 阴茎短小 阴茎增大
早泄 前列腺炎 阴茎增粗 阴茎延长
国际机票 上海国际机票
国际特价机票 国际打折机票
CRM 客户管理软件 客户关系管理
免费客户管理软件 客户管理软件下载 客户信息管理系统 销售管理系统 销售管理
CRM系统 CRM软件 客户关系管理系统
客户关系管理软件 客户管理 客户管理系统 营销管理系统 客户资源管理 销售管理软件 客户资料管理软件 客户资源管理软件
客户信息管理软件 客户资料管理 客户资源管理 客户信息管理 客户资料管理系统
客户资源管理系统 客户管理软件免费版
砂磨机 砂磨机
砂磨机 卧式砂磨机
卧式砂磨机 卧式砂磨机
三辊研磨机 三辊研磨机
三辊研磨机 混合机 混合机
混合机 锥形混合机 锥形混合机 锥形混合机 行星动力混合机 行星动力混合机 行星动力混合机 无重力混合机 无重力混合机 无重力混合机
干粉砂浆设备 干粉砂浆设备
干粉砂浆设备 捏合机 捏合机 捏合机 导热油炉 导热油炉 导热油炉 反应釜 反应釜 反应釜 搪玻璃反应釜 搪玻璃反应釜 搪玻璃反应釜
乳化机 涂料设备 干混砂浆设备 无重力混合机 胶体磨 涂料成套设备 双螺旋混合机
北京婚庆 北京婚庆公司
400电话
办证 呼吸机 制氧机
亚都 亚都加湿器 亚都净化器
亚都装修卫士
饰品批发 小饰品批发 韩国饰品 韩国饰品批发 premature ejaculation penis enlargement
破碎机 制砂机 球磨机 雷蒙磨 雷蒙磨粉机 鄂式破碎机 鄂式破碎机 免烧砖机 加气混凝土设备
反击式破碎机 选矿设备
安利产品 马来西亚留学
网站优化 网站推广
衬布
代写论文
代写论文
论文代写 代写论文
磁力泵
离心泵
化工泵
隔膜泵
螺杆泵
潜水泵
油泵
耐腐蚀泵
水泵
拖链 防护罩 排屑机 塑料拖链 钢铝拖链
化工离心泵
计量加油泵
自吸式离心泵
管道油泵
自吸式排污泵
潜水排污泵
自吸式磁力泵
耐高温磁力泵
不锈钢多级离心泵
多级离心泵
耐腐蚀自吸泵
自吸化工泵
玻璃钢液下泵
液下式排污泵
卧式离心清水泵
氟塑料磁力泵
磁力驱动循环泵
耐腐蚀污水泵
卧式化工离心泵
玻璃钢耐酸泵
防爆管道油泵
不锈钢多级泵
立式多级离心泵
塑料磁力泵
水泵厂
手摇油泵
上海水泵厂
上海水泵
离心泵厂家
热水泵
清水泵
气动隔膜泵
深圳装饰 深圳装饰公司 深圳装修公司
特价机票 打折机票 国际机票
机票
新风换气机 换气机 立式新风换气机 风机箱 新风系统 能量回收机
搅拌机 混合机 乳化机
分散机
毛刷 毛刷辊 工业毛刷 刷子 钢丝刷
涂层测厚仪 硬度计
兆欧表 激光测距仪
测振仪 转速表
温湿度计 风速仪
超声波测厚仪
粗糙度仪
噪音计 红外测温仪
万用表
硬度计 万用表
美容院 美容加盟
澳洲留学 澳大利亚留学
什么是法兰
电烤箱
酒店预定 北京酒店预定 北京酒店
离心机
nail equipment nail products nail product nail uv lamp nail uv lamp nail uv lamps uv nail lamp nail brush
nail file nail tool nail tip nail gel curing uv lamps lights
万用表 风速仪
红外测温仪 噪音计
苗木价格 苗木信息 标牌制作 深圳标牌 北京儿童摄影 防静电鞋 淘宝刷信誉
威海凤凰湖 威海海景房 大庆密封件
打标机 淘宝刷信誉 TESOL/TEFL国际英语教师证书 英语教师进修及培训 北京快递公司 北京国际快递

uiyui said...

Youth is warcraft leveling not a time of life;warcraft leveling it is a wow lvl state of mind; wow power level it is not power leveling amatter of World of warcraft Power Leveling rosy cheeks, red wrath of the lich king power leveling lips and supple knees;WOTLK Power Leveling it is a matter of thewill,wlk Power Leveling a quality of buy aoc gold the imagination,aoc gold a vigor of the emotions; it is thefreshness of the deep springs wow gold of life. Youth means a tempera-mental maplestory mesos predominance of courage over timidity, of the appetite formaple story mesos adventure over the love of ease. wow gold This often existsin a man of 60 more than a boy of 20. Nobody grows old merely by anumber of years.

Rajesh Shah said...

Hi that was a nice piece of advice...is there anything we have to merge records in the same table?

rpungin said...

Very good example. Thanks!

Steve said...

Hi,

I have a need to merge data from 2 databases (same schema). Can the merge statement be used to merge data from the same table name in different databases? I would in this case be adding data from Oradb2 into the existing data in Oradb1 for example where both have the same schema, but different records, keys are managed so no collisions etc.

Andrea said...

Very helpful post. I have not used merge statement so far because I think its very slow but I do strongly agree with the solution that you have provided. I an sure it will be faster option to use on the process that I am working on.
oracle ebs r12