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. 【Azure Redis 缓存】Lettuce 连接到Azure Redis服务,出现15分钟Timeout问题

    问题描述 在Java应用中,使用 Lettuce 作为客户端SDK与Azure Redis 服务连接,当遇见连接断开后,长达15分钟才会重连.导致应用在长达15分的时间,持续报错Timeout 问题解 ...

  2. 【Azure 应用服务】Azure App Service多实例中,出现某一个实例CPU居高不下的情况,如何重启单个实例呢?

    问题描述 在使用App Service服务中,当多实例中,其中一个实例出现高CPU,高Memory的情况,为了尽可能少的影响正在运行的应用,需要单独重启某一个实例的情况下,如何手动操作呢? 问题解答 ...

  3. 【Azure Redis 缓存】Redis的指标显示CPU为70%,而Service Load却达到了100%。这两个指标意义的解释及如何缓解呢?

    问题描述 为什么Redis的指标显示CPU为70%,而Service Load却达到了100%, 如何来解释这两个指标,以及如何来缓解这样的情况呢? 问题回答 CPU指标:该值表示的是用于 Redis ...

  4. kotlin协程异常处理之-try catch

    kotlin协程小记 协程的async使用 kotlin协程异常处理之-try catch kotlin协程异常处理之-CoroutineExceptionHandler 一.try catch tr ...

  5. C++ //类模板分文件编写问题及解决 //第一中解决方式 直接包含源文件 //第二种解决方法 将.h 和 cpp的内容写到一起,将后缀改为.hpp文件

    1 //第一种方式被注释 2 //未被注释是第二种方式 3 //类模板分文件编写问题及解决 4 5 6 #include <iostream> 7 #include <string& ...

  6. 建立两台linux主机的ssh信任,实现ssh免密登录远程服务器

    1.介绍 假设我们现在有AB两个服务器,要求A能够远程登录到B服务. CentOS版本:CentOS Linux release 7.6.1810 (Core) 2.实操 1.先在A服务上输入以下命令 ...

  7. F12 Preserve log 查看之前的api接口返回数据,只有火狐浏览器能用

    F12 Preserve log 查看之前的api接口返回数据,只有火狐浏览器能用

  8. iMindMap 10 的使用体验 + 讯飞输入法 + windows防火墙 (完美)

    这个软件 最终的效果非常好. 但是有一个硬bug,就是输入光标 搜狗输入法和百度输入法,输入法获取不到,导致输入中文的时候,文字候选框位置特别远. 如果是纯英文 输入使用,就没有这个bug. 总结: ...

  9. mac Error: EACCES: permission denied, mkdir

    原因还是权限问题 就是说 npm 出于安全考虑不支持以 root 用户运行,即使你用 root 用户身份运行了,npm 会自动转成一个叫 nobody 的用户来运行,而这个用户几乎没有任何权限.这样的 ...

  10. 关于Java执行Cmd命令出现的死锁问题解决

    原文:关于Java执行Cmd命令出现的死锁问题解决 - Stars-One的杂货小窝 问题 之前研究了Java通过执行cmd命令从而触发Android打包的思路,但是发现Android打包成功之后,后 ...