Merge into的使用详解-你Merge了没有

2023-11-09

 

Merge是一个非常有用的功能,类似于Mysql里的insert into on duplicate key. 

Oracle在9i引入了merge命令, 
通过这个merge你能够在一个SQL语句中对一个表同时执行inserts和updates操作. 当然是update还是insert是依据于你的指定的条件判断的,Merge into可以实现用B表来更新A表数据,如果A表中没有,则把B表的数据插入A表. MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表 

语法如下 
MERGE INTO [your table-name] [rename your table here] 
USING ( [write your query here] )[rename your query-sql and using just like a table] 
ON ([conditional expression here] AND [...]...) 
WHEN MATHED THEN [here you can execute some update sql or something else ] 
WHEN NOT MATHED THEN [execute something else here ! ] 

我们先看看一个简单的例子,来介绍一个merge into的用法 
merge into products p using newproducts np on (p.product_id = np.product_id) 
when matched then 
update set p.product_name = np.product_name 
when not matched then 
insert values(np.product_id, np.product_name, np.category) 

在这个例子里。前面的merger into products using newproducts 表示的用newproducts表来merge到products表,merge的匹配关系就是on后面的条件子句的内容,这里根据两个表的product_id来进行匹配,那么匹配上了我们的操作是就是when matched then的子句里的动作了,这里的动作是update set p.product_name = np.product_name, 很显然就是把newproduct里的内容,赋值到product的product_name里。如果没有匹配上则insert这样的一条语句进去。 大家看看这个merget inot的用法是不是一目了然了呀。这里merger的功能,好比比较,然后选择更新或者是插入,是一系列的组合拳,在做merge的时候,这样同样的情况下,merge的性能是优于同等功能的update/insert语句的。有人曾经分析merge是批量处理对性能贡献很大,个人觉得这个是没有考据的。 

我们也可以在using后面使用视图或者子查询。比如我们把newproducts换成 
merge into products p using (select * from newproducts) np on (p.product_id = np.product_id) 
when matched then 
update set p.product_name = np.product_name 
when not matched then 
insert values(np.product_id, np.product_name, np.category) 
也是可以的。 

在Oracle 10g中MERGE有如下一些改进: 
1、UPDATE或INSERT子句是可选的 
2、UPDATE和INSERT子句可以加WHERE子句 
3、在ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表 
4、UPDATE子句后面可以跟DELETE子句来去除一些不需要的行 

我们通过实例来一一看看如上的新特性 

1. UPDATE或INSERT子句是可选的 
在9i里由于必须insert into和update都要存在,也就是不是update就是insert,不支持单一的操作,虽然还是可以曲线救国,呵呵 但是有些过于强势了。而10g里就是可选了,能符合我们更多的需求了 
比如上面的句子 
我们可以只存在update或者insert 
merge into products p using newproducts np on (p.product_id = np.product_id) 
when matched then 
update set p.product_name = np.product_name 
这里,如果匹配就更新,不存在就不管了。 

2. UPDATE和INSERT子句可以加WHERE子句 
这也是一个功能性的改进,能够符合我们更多的需求,这个where的作用很明显是一个过滤的条件,是我们加入一些额外的条件,对只对满足where条件的进行更新和insert 
merge into products p using (select * from newproducts) np on (p.product_id = np.product_id) 
when matched then 
update set p.product_name = np.product_name where np.product_name like 'OL%' 
这里表示只是对product_name开头是'OL'的匹配上的进行update,如果开头不是'OL'的就是匹配了也不做什么事情,insert里也可以加入where 
比如 
merge into products p using (select * from newproducts) np on (p.product_id = np.product_id) 
when matched then 
update set p.product_name = np.product_name where np.product_name like 'OL%' 
when not matched then 
insert values(np.product_id, np.product_name, np.category) where np.product_name like 'OL%' 

这里注意比较一下,他们返回的结果行数,是有着差异的。 

3. 在ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表 

merge into products p using (select * from newproducts) np on (1=0) 
when matched then 
update set p.product_name = np.product_name 
when not matched then 
insert values(np.product_id, np.product_name, np.category) 
个人觉得这个功能没有太大的意义,我们的insert into本身就支持这样的功能,没有必要使用merge 

4. UPDATE子句后面可以跟DELETE子句来去除一些不需要的行 
delete只能和update配合,从而达到删除满足where条件的子句的纪录 
merge into products p using (select * from newproducts) np on (p.product_id = np.product_id) 
when matched then 
update set p.product_name = np.product_name delete where p.product_id = np.product_id where np.product_name like 'OL%' 
when not matched then 
insert values(np.product_id, np.product_name, np.category) 
这里我们达到的目的就是 会把匹配的记录的prodcut_name更新到product里,并且把product_name开头为OL的删除掉。

merge into也是一个dml语句,和其他的dml语句一样需要通过rollback和commit 结束事务。 

Merge是一个非常强大的功能,而且是我们需求里经常会用到的一个有用的功能,所以我们一定要好好的学习到。 

文中需要的测试脚本在附件里提供下载。 
merge into sample.sql

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Merge into的使用详解-你Merge了没有 的相关文章

  • Git 分支 --merged / --no-merged 和 --squash 选项

    git branch merged似乎与 squash 配合得不好 如果你做一个正常的git merge then git branch merged告诉您哪些分支已被合并 然而 如果使用 squash 选项 则情况并非如此 即使生成的树是
  • 基于向量键合并数据框

    我是一个绝对的初学者 希望有人能够帮助我解决合并问题 我今晚大部分时间都在解决这个问题 并且迄今为止无法成功地将解决方案应用于此特定示例的类似问题 我制作了一个虚拟数据框和向量来帮助说明我的问题 dumdata lt data frame
  • gridview中如何合并两个单元格

    我在 gridview 中有一些数据 格式如下 A B 1 2 adeel 3 4 sml 现在我想将该行与 B 列下的空单元格合并 我该怎么做 您可以使用 layout columnSpan 或 layout rowSpan 根据需要使对
  • 将两个 PDF 页面合并为新页面,文本内容之间不留空格

    all 我想将两个 PDF 合并为一个 PDF 与此同时 我想无缝地加入这两个 PDF 例如 假设第一个PDF文件的最后一页有很多空白 合并后 我希望第二个PDF从第一个PDF的空白开始 我们有任何工具支持吗 这是一项并不难的任务 假设我们
  • TFS 合并:无法丢弃变更集

    我们有一个变更集 开发人员已签入对源分支和目标分支的更改 许多更改包括两个分支中的重命名 从源分支到目标分支的变更集合并进展顺利 但变更集仍保留在要合并的变更集列表中 当我现在尝试再次合并更改集时 它显示 没有要合并的更改 并且变更集保留在
  • 使用 T-SQL Merge 语句时如何避免插入重复记录

    我尝试使用 T SQL 的 MERGE 语句插入许多记录 但当源表中存在重复记录时 我的查询无法 INSERT 失败的原因是 目标表有一个基于两列的主键 源表可能包含违反目标表主键约束的重复记录 抛出 违反主键约束 我正在寻找一种方法来更改
  • 垂直或水平合并单元格[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Adob e Flex 中合并 DataGrid Advanced DataGrid 中的单元格 https stackoverflow com questions 6910625 how t
  • “天真的”svn 从分支合并到主干?

    我正在将 TortoiseSVN 用于我的 C 项目 并尝试将 分支重新集成 回主干 我的情况很简单 因此对于分支中更改的每个文件 我希望它完全覆盖主干中的匹配文件 不幸的是 TortoiseSVN 比我聪明 因此它合并了每对文件 导致了一
  • 识别不在另一个数据框中的记录

    我有一个像这样的数据框 data1 pd DataFrame a z 0 a y 20 b z 1 columns id1 id2 number data2 pd DataFrame a y 1 a y 1 b z 0 columns id
  • Java流合并或减少重复对象

    我需要通过将所有重复条目合并到一个对象中来从可以具有重复项的列表中生成一个唯一的朋友列表 Example 从不同的社交源中获取好友并放入 1 个大列表中1 朋友 姓名 约翰尼 德普 出生日期 1970 11 10 来源 FB fbAttri
  • 如何合并两个 Git 存储库?

    考虑以下场景 我在自己的 Git 存储库中开发了一个小型实验项目 A 它现在已经成熟了 我希望 A 成为更大的项目 B 的一部分 该项目有自己的大存储库 我现在想将 A 添加为 B 的子目录 如何将 A 合并到 B 中而不丢失任何一方的历史
  • 如何 UPSERT(更新或插入表?)

    UPSERT 操作更新或插入表中的行 具体取决于表是否已有与数据匹配的行 if table t has a row exists that has key X update t set mystuff where mykey X else
  • 当文件标记为“历史记录已提交”时,svn diff

    我对已合并到工作目录中主干的分支进行了更改 svn stat 显示已更改文件的正确列表 但是 svn stat 输出在计划提交新添加到分支的每个文件的历史记录中包含一个 A src main java com java 当我运行 svn d
  • 过早退出 Qualtrics 中的循环和合并块

    我目前正在进行一项 Qualtrics 调查 受访者必须解决一长串字谜问题 然后回答一些人口统计问题 为了使变位词部分更容易 我使用了循环和合并块 第一个字段是要解决的变位词 第二个字段是变位词的解决方案 因此调查可以根据受访者的答案来检查
  • 在另一列中查找重复值时,如何将列数据存储为逗号分隔值? [复制]

    这个问题在这里已经有答案了 如果任何公司的产品都相同 我必须组合或内爆子数组值 预期输出应该类似于 0 gt array company gt 1 6 product gt 5 我的数组是 array 0 gt array company
  • JPA更新一对多关系列表

    我有一个 Question 实体 其中包含另一个名为 Alternatives 的实体的列表 如下所示 public class Question OneToMany fetch FetchType LAZY mappedBy questi
  • 根据不平凡的标准有效合并两个数据帧

    正在接听这个问题 https stackoverflow com questions 18821862 data selection error 18823432 18823432昨晚 我花了一个小时试图找到一个没有增长的解决方案data
  • 在 Pandas 中,如何从基于另一个数据框的数据框中删除行?

    我有 2 个数据框 一个名为 USERS 另一个名为 EXCLUDE 他们都有一个名为 电子邮件 的字段 基本上 我想删除 USERS 中包含 EXCLUDE 中包含电子邮件的每一行 我该怎么做 您可以使用boolean indexing
  • 默认情况下 git merge -Xignore-space-change

    我该如何设置该选项ignore space change对于所有合并使用git config 我也许可以使用别名merge 但因为我希望该设置应用于git stash pop git stash apply git pull and git
  • 在 Haskell 中合并两个列表

    无法弄清楚如何合并两个列表通过以下方式在哈斯克尔 INPUT 1 2 3 4 5 11 12 13 14 OUTPUT 1 11 2 12 3 13 4 14 5 我想提出一个更懒的合并版本 merge ys ys merge x xs y

随机推荐

  • 出现No module named ‘keras‘ 或者 module ‘xxxxxxx’ has no attribute ‘xxx’ 的问题原因和解决方案

    问题一 当导入keras工具包时出现 No module named keras 出现这个问题时 说明你的python语言库中并没有安装这个工具包 打开cmd 然后输入命令pip install keras就可以了 然后在python环境中
  • React-Native画线平滑处理

    参考 http blog csdn net pz789as article details 52795275 这次开发要手写画线 我们一般画线的时候是直接获取屏幕上的点 然后利用ART绘制出一天路径线 Sample React Native
  • 蓝桥杯 2019 JAVA A组 最大降雨量

    题目 试题四 最大降雨量 问题描述 由于沙之国长年干旱 法师小明准备施展自己的一个神秘法术来求雨 这个法术需要用到他手中的49张法术符 上面分别写着1至49这49个数字 法术一共持续7周 每天小明都要使用一张法术符 法术符不能重复使用 每周
  • Psins代码解析之全局变量&轨迹仿真(test_SINS_trj.m)&惯性解算(test_SINS.m)

    旋转椭球体的4个基本参数 长半轴 扁率 椭圆度 地心引力常数 自转角速率 以上内容来自 车载定位定向系统关键技术研究 付强文 旋转椭球体 地球自转角速度 地球重力加速度为 子午圈和卯酉圈曲率半径为 以上内容来自 捷联惯导算法及车载组合导航系
  • 梯度下降法求解方程的极值

    1 方法一 利用梯度下降算法求解y x 2的极值 注意 此种方法 除了x的更新之外 还有一点需要注意 那就迭代停止的条件 可以设置一个阈值a 比较x更新前后的y的差的绝对值与阈值a的大小 即 y与a的大小 当 y a时 停止迭代 impor
  • 设置熄屏_手机摁下这个开关,熄屏也能显示时间!很多人没用过,太可惜了

    其实在手机的使用过程中 很多实用功能都被大家忽略掉了 如手机熄屏显示时间这个功能 在日常生活中就十分的实用 但是很多人都没用过 这就很可惜了 下面我们就一起来看一下吧 1 华为手机 华为手机也是支持手机熄屏显示时间的 下面我们就一起来看一下
  • d3.js 小结

    D3 数据可视化库 D3 4 0 D3是目前最流行的JavaScript可视化图表库之一 D3的图表类型非常丰富 并且支持SVG格式 因此应用十分广泛 也有很多图表插件基于D3开发 比如MetricsGraphics js 在D3上构建的数
  • 自下而上的炫酷进度条 --- Android自定义组件进阶版

    效果展示 自下而上的炫酷进度条效果展示 源码分析 第一步 创建自定义组件类 第二步 自定义属性文件编写
  • face_recognition库使用教程

    Jupyter Notebook文件及图片数据见 百度网盘 import cv2 import dlib import math import pprint import numpy as np import face recognitio
  • WordPress系列教程(一)----WordPress环境准备与安装

    一 前言 前段时间自己搭建了个WordPress的博客 用来做资源分享 主要包括视频教程 电子书 源码等一些学习资源网站地址是 http www 98share cn 当时考虑的是练练手 所以在淘宝上 随便买了个虚拟主机 200多快挺便宜的
  • 数据结构:树(基本概念)

    树 集合中的元素关系呈现出一对多的情况 非线性结构 1 n 1 树的定义 树 Tree 是n n 0 个节点的有限集合T 它满足两个条件 有且仅有一个特定的称为根 Root 的节点 其余的节点可以分为m m 0 个互不相交的有限集合T1 T
  • Python爬虫—手机销量

    介绍 最近在学习Python的一些相关知识 爬虫是其中有趣的一项 现在把学习的过程整理出来 给自己留个印记 Selenium爬取天猫手机数据 淘宝的反爬虫有点厉害 光是登陆就研究了小一天 先是尝试模拟输入用户名和密码 但是会出现让拖动滑块
  • Python 模块的概念和基本使用

    视频版教程 Python3零基础7天入门实战视频教程 模块和包 在Python的标准安装中 包含了一组自带的模块 这些模块被成为 标准库 比如常用的math random datetime os json等等 此外 还有很多的第三方模块 比
  • MIPI_DSI协议简要介绍

    MIPI DSI是一种应用于显示技术的串行接口 兼容DPI 显示像素接口 Display Pixel Interface DBI 显示总线接口 Display Bus Interface 和DCS 显示命令集 Display Command
  • tomcat配置400404500类型的错误页面,修改项目默认路径,修改默认项目

    修改项目默认路径 修改默认项目 http xxx xxxxxx xxx 直接访问 找到tomcat路径中conf文件夹下server xml文件找到 修改成 说明 xxx xxx xxx xxx webapps修改的项目默认路径 xxx x
  • 云服务器子系统,Linux子系统使用云服务器

    Linux子系统使用云服务器 内容精选 换一换 用户使用创建弹性云服务器时使用的密钥文件登录Linux弹性云服务器时 登录失败 根据Linux弹性云服务器使用的镜像不同 可能会存在如下原因 原因一 Linux弹性云服务器的镜像为用户自己制作
  • MATLAB生成M序列和Gold序列

    M序列 最长线性移位寄存器序列又称为m序列 他是一种伪随机序列 在硬件电路中 m序列可以通过反馈移位寄存器产生 寄存器的反馈连接有生成m序列的本源多项式确定 m序列的 0 0 0映射成 1 1
  • CentOS 7.9 安装Docker

    Docker简单介绍 Docker的应用场景 Web 应用的自动化打包和发布 自动化测试和持续集成 发布 在服务型环境中部署和调整数据库或其他的后台应用 Docker 的优点 Docker 是一个用于开发 交付和运行应用程序的开放平台 Do
  • 《oracle大型数据库系统在AIX/unix上的实战详解》讨论十二:关于读书

    感谢大家对这本书的热情和踊跃来信 这段日子有几位朋友都提出了类似于下面问题的问题 我在找这方面的工作 想学习您这本书进这一行 您看看怎么看合适 太厚了 我想开始阅读 oracle大型数据库系统在AIX unix上的实战详解 这本书 请问您有
  • Merge into的使用详解-你Merge了没有

    Merge是一个非常有用的功能 类似于Mysql里的insert into on duplicate key Oracle在9i引入了merge命令 通过这个merge你能够在一个SQL语句中对一个表同时执行inserts和updates操