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 API 管理】是否可以将Swagger 的API定义导入导Azure API Management中

    问题描述 是否可以将Swagger 的API定义导入导Azure API Management中? 操作步骤 是的,可以通过APIM门户导入单个的API Swagger定义文件.具体步骤如下: 第一步 ...

  2. Isito 入门(二):Istio 的部署

    本教程已加入 Istio 系列:https://istio.whuanle.cn 目录 2,部署 Istio 安装 Helm 部署 istio-base 部署 istiod 部署 istio-ingr ...

  3. 影刀rpa:第二个项目学习心得

    教程有说到元素的关联操作,教程说自上而下的html路径,一时之间没弄清楚,索性就去看了下网页的html源码,才弄清楚到底是咋回事: 我是先选中了列表子元素的价格字段,选择两次以后就能选择到所有列表子元 ...

  4. Java 从键盘上输入"year"“month”和“day”,要求通过程序输出 输入的日期为第几年的第几天

    1 /** 2 * 编写程序: 3 * 从键盘上输入"year""month"和"day",要求通过程序输出 4 * 输入的日期为第几年的第 ...

  5. 案例8:将"picK"的大小写互换

    最终输出结果为PICk. 需要先计算两个字母之间的间隔,比如a和A之间的间隔为多少. 然后在将大写字母转换为小写字母,加上间隔的值: 将小写字母转换为大写字母,减去间隔的值. 示例代码如下: #def ...

  6. Nginx安装nginx-rtmp-module模块

    简介 nginx中的模块虽然就是类似插件的概念,但是它无法像VsCode那样轻松的安装扩展. nginx要安装其它模块必须同时拿到nginx源代码和模块源代码,然后手动编译,将模块打到nginx中,最 ...

  7. private priv 私人 pri=prim first v=self 自己第一

    private priv 私人 pri=prim first v=self 自己第一 private v自己-私人的 pri 来自PIE*per,向前,穿过 pri = pre 向前(这么理解也说的过 ...

  8. 完美解决浏览器输入http被自动跳转至https问题

    查阅相关资料,发现这是浏览器的HSTS(HTTP Strict Transport Security)功能引起的.在安装配置SSL证书时,可以使用一种能使数据传输更加安全的Web安全协议,即在服务器端 ...

  9. Feign调用远程服务时传递Cookie信息

    @Configuration public class TtpfFeignConfig { @Bean public RequestInterceptor requestInterceptor(){/ ...

  10. autowired循环调用

    下面这段代码,表示那你的bean进行了循环调用. org.springframework.beans.factory.BeanCreationException: Error creating bea ...