MogDB/openGauss 中 merge 的语法解析

近期了解学习了 MogDB/openGauss 中 merge 的使用,merge 语法是根据源表对目标表进行匹配查询,匹配成功时更新,不成功时插入。简单来说就是有则更新,无则插入,语句简洁,效率高。

下面展示 MogDB/openGauss 中 merge 的语法

openGauss=# \h merge

Command: MERGE

Description: insert, update, or delete rows of a table based upon source data

Syntax:

MERGE [/*+ plan_hint */] INTO table_name [ [ AS ] alias ]

USING { { table_name | view_name } | subquery } [ [ AS ] alias ]

ON ( condition )

[

WHEN MATCHED THEN

UPDATE SET { column_name = { expression | DEFAULT } |

( column_name [, ...] ) = ( { expression | DEFAULT } [, ...] ) } [, ...]

[ WHERE condition ]

]

[

WHEN NOT MATCHED THEN

INSERT { DEFAULT VALUES |

[ ( column_name [, ...] ) ] VALUES ( { expression | DEFAULT } [, ...] ) [, ...] [ WHERE condition ] }

];

创建测试表

merge 有几种匹配条件可以交叉选择。 作用: 判断源表和目标表是否满足合并的条件 如果满足

用源表去更新目标表

用源表去删除目标表

什么也不干

如果不满足

用源表去插入目标表

什么也不干

创建出满足的表

create table a_merge (

id int not null,

name varchar not null,

year int

);

create table b_merge (

id int not null,

aid int not null,

name varchar not null,

year int,

city varchar

);

create table c_merge (

id int not null,

name varchar not null,

city varchar not null

);

测试一:匹配则修改,无则插入

--插入数据

insert into a_merge values(1,'liuwei',20);

insert into a_merge values(2,'zhangbin',21);

insert into a_merge values(3,'fuguo',20);

insert into b_merge values(1,2,'zhangbin',30,'吉林');

insert into b_merge values(2,4,'yihe',33,'黑龙江');

insert into b_merge (id,aid,name,city) values(3,3,'fuguo','山东');

--数据对比

select * from a_merge; select * from b_merge;

id | name | year

----+----------+------

1 | liuwei | 20

2 | zhangbin | 21

3 | fuguo | 20

(3 rows)

id | aid | name | year | city

----+-----+----------+------+--------

1 | 2 | zhangbin | 30 | 吉林

2 | 4 | yihe | 33 | 黑龙江

3 | 3 | fuguo | | 山东

(3 rows)

--merge语句

merge into a_merge a

using (select b.aid,b.name,b.year from b_merge b) c on (a.id=c.aid)

when matched then

update set year=c.year

when not matched then

insert values(c.aid,c.name,c.year);

--更新后的a_merge表

select * from a_merge;

id | name | year

----+----------+------

1 | liuwei | 20

2 | zhangbin | 30

3 | fuguo |

4 | yihe | 33

(4 rows)

测试二:匹配则修改,无则不操作

--插入数据

insert into b_merge values(4,1,'liuwei',80,'江西');

insert into b_merge values(5,5,'tiantian',23,'河南');

--核对数据

select * from a_merge;select * from b_merge;

id | name | year

----+----------+------

1 | liuwei | 20

2 | zhangbin | 30

3 | fuguo |

4 | yihe | 33

(4 rows)

id | aid | name | year | city

----+-----+----------+------+--------

1 | 2 | zhangbin | 30 | 吉林

2 | 4 | yihe | 33 | 黑龙江

3 | 3 | fuguo | | 山东

4 | 1 | liuwei | 80 | 江西

5 | 5 | tiantian | 23 | 河南

(5 rows)

--merge语句

merge into a_merge a

using (select b.aid,b.name,b.year from b_merge b) c on (a.id=c.aid)

when matched then

update set year=c.year;

--数据对比

select * from a_merge;

id | name | year

----+----------+------

1 | liuwei | 80

2 | zhangbin | 30

3 | fuguo |

4 | yihe | 33

(4 rows)

测试三:匹配无操作,不匹配进行 insert

--修改测试数据

update b_merge set year=70 where aid=2;

--两表对比

select * from a_merge;select * from b_merge;

id | name | year

----+----------+------

1 | liuwei | 80

2 | zhangbin | 30

3 | fuguo |

4 | yihe | 33

(4 rows)

id | aid | name | year | city

----+-----+----------+------+--------

2 | 4 | yihe | 33 | 黑龙江

3 | 3 | fuguo | | 山东

4 | 1 | liuwei | 80 | 江西

5 | 5 | tiantian | 23 | 河南

1 | 2 | zhangbin | 70 | 吉林

(5 rows)

--merge语句

merge into a_merge a

using (select b.aid,b.name,b.year from b_merge b) c on (a.id=c.aid)

when not matched then

insert values(c.aid,c.name,c.year);

--查看a_merge表

select * from a_merge;

id | name | year

----+----------+------

1 | liuwei | 80

2 | zhangbin | 30

3 | fuguo |

4 | yihe | 33

5 | tiantian | 23

(5 rows)

测试四:一律 insert

--merge语句

merge into c_merge c

using (select b.aid,b.name,b.city from b_merge b) b on (1=0)

when not matched then

insert values(b.aid,b.name,b.city);

--查看两表,条数相同

select * from c_merge ;select * from b_merge ;

id | name | city

----+----------+--------

3 | fuguo | 山东

5 | tiantian | 河南

2 | zhangbin | 吉林

4 | yihe++ | 黑龙江

1 | liuwei++ | 江西

6 | ningqin | 江西

7 | bing | 吉安

(7 rows)

id | aid | name | year | city

----+-----+----------+------+--------

3 | 3 | fuguo | | 山东

5 | 5 | tiantian | 23 | 河南

1 | 2 | zhangbin | 70 | 吉林

2 | 4 | yihe++ | 33 | 黑龙江

4 | 1 | liuwei++ | 80 | 江西

6 | 6 | ningqin | 23 | 江西

7 | 7 | bing | 24 | 吉安

(7 rows)

MogDB/openGauss中merge的语法解析的更多相关文章

  1. Oracle中merge into语法

    merge into 语句就是insert和update的一个封装,简单来说就是: 有则更新,无则插入 下面说怎么使用 MERGE INTO table_Name  T1(匿名) using (另外一 ...

  2. oracle中merge into用法解析

    merge into的形式: MERGE INTO [target-table] A USING [source-table sql] B ON([conditional expression] an ...

  3. 在.NET Core中使用Irony实现自己的查询语言语法解析器

    在之前<在ASP.NET Core中使用Apworks快速开发数据服务>一文的评论部分,.NET大神张善友为我提了个建议,可以使用Compile As a Service的Roslyn为语 ...

  4. python在lxml中使用XPath语法进行#数据解析

    在lxml中使用XPath语法: 获取所有li标签: from lxml import etree html = etree.parse('hello.html') print type(html) ...

  5. Java中的static关键字解析

    Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...

  6. Oracle中Merge into用法总结

    MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句.通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,连接条件匹配上的进行UPDATE,无法匹配的执 ...

  7. With语句以及@contextmanager的语法解析

    with 语句以及@contextmanager的语法解析   with语句可以通过很简单的方式来替try/finally语句. with语句中EXPR部分必须是一个包含__enter__()和__e ...

  8. MySQL- -Join语法解析与性能分析

    Mysql Join语法解析与性能分析 一.Join语法概述 join 用于多表中字段之间的联系,语法如下: ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ...

  9. Java中的static关键字解析 转载

    原文链接:http://www.cnblogs.com/dolphin0520/p/3799052.html Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到 ...

  10. oracle中merge的详解

    Oracle在9i引入了merge命令, 通过这个merge你能够在一个SQL语句中对一个表同时执行inserts和updates操作. 当然是update还是insert是依据于你的指定的条件判断的 ...

随机推荐

  1. STL-RBT_map,set模拟实现

    set #include"26RBT_container.h" namespace test { //set通过普通迭代器使用const迭代器实现限制key不能被修改 templa ...

  2. CPN Tools 系统建模分析工具(持续更新)

    一直想把之前看有关CPN的文献资料做一个综合性的整理,所以最近花了些时间,把乌克兰敖德萨国家电信科学院交通运输部学院的讲义做一个翻译.本课程的翻译不具授权(如有侵权请及时联系,做删除处理) 本课程的标 ...

  3. CPNtools协议建模安全分析---实例(二)

    首先,token值是变迁的内部的,当变迁点火触发的时候token才会在网络中移动.在颜色Petri网中token是有区分的. 1.我么现在举一个学生吃饼的例子 ,颜色这样定义.    s表示一个学生类 ...

  4. 【主流技术】日常工作中关于 JSON 转换的经验大全(Java)

    目录 前言 一.JSON 回顾 1.1结构形式 二.其它类型 -> JSON相关 2.1 JavaBean 转 JsonObject 2.2 JavaBean 转 Json 字符串 2.3 Li ...

  5. idea vue 格式化 并保存文件 宏 快捷键 ctrl+s

    idea 格式化是 reformat Code 存盘是 ctrl+s 所以创建一个宏,先点格式化,再点存盘,然后定义个ctrl+s的快捷键覆盖之前的保存就ok了. 资料: IDEA 配置宏定义 并为宏 ...

  6. 灰度发布、蓝绿部署、金丝雀发布和AB测试及在k8s中的实现

    灰度发布.蓝绿部署.金丝雀发布和AB测试都是软件开发和部署中常用的策略,每种策略都有其特定的用途和优势.下面是对这些策略的简要解释: 灰度发布(Grayscale Release): 灰度发布是一种逐 ...

  7. FIR滤波器的设计和实现

    FIR的作用和价值   FIR(Finite Impulse Response)滤波器:有限长单位冲激响应滤波器,又称为非递归型滤波器,是数字信号处理系统中最基本的元件,它可以在保证任意幅频特性的同时 ...

  8. python 音频通道分离的源码实现

    一 前记 作为一个音频工程师,仅仅依靠鼠标点击,没有一些自己的小工具的话,肯定是不合格的了. 最近用到了一个音频通道分离的功能,这里就用python敲击了一下,这里做个备忘吧,给有需求的小伙伴抛砖引玉 ...

  9. Android Swtich开关样式调整

    原文:Android Swtich开关样式调整 - Stars-One的杂货小窝 接入百度人脸的demo时候,发现了内置的switch开关比较好看,看了下实现方法,原来只是改了下样式,记录一下 效果: ...

  10. day05-Lombok、SpringInitializer

    Lombok.Spring-Initializer 1.Lombok 1.1Lombok介绍 Lombok的作用是: 简化Javabean的开发,可以使用Lombok的注解让代码更加简洁 Java项目 ...