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. DataGear 制作联动异步加载图表的数据可视化看板

    通过DataGear的参数化数据集.图表事件处理和看板API功能,可以很方便地制作联动异步加载图表的数据可视化看板. 首先,新建一个参数化SQL数据集,如下所示: SELECT COL_NAME, - ...

  2. expect tcl 摘录

    目录 部分参考来源说明 例子 expect命令 核心命令有三个 spawn.expect.send 其他expect命令 expect命令的选项 变量 tcl摘录 数据类型 符号 命令 其他说明 部分 ...

  3. 百亿节点、毫秒级延迟,携程金融基于 NebulaGraph 的大规模图应用实践

    作者:霖雾,携程数据开发工程师,关注图数据库等领域. 0. 背景 2017 年 9 月携程金融成立,在金融和风控业务中,有多种场景需要对图关系网络进行分析和实时查询,传统关系型数据库难以保证此类场景下 ...

  4. Java 演示线程的死锁问题

    1 package bytezero.deadlock; 2 3 /** 4 * 演示线程的死锁问题: 5 * 6 * 1.死锁的理解:不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃 7 ...

  5. Java 设计模式----单例模式--饿汉式

    1 package com.bytezreo.singleton; 2 3 /** 4 * 5 * @Description 单例设计模式 例子-----饿汉式 6 * @author Bytezer ...

  6. 单词本z escort 护卫 es=ex 出去 cor=con=com 一起, 一起出去 = 护卫

    单词本z escort 护卫 es=ex 出去 cor=con=com 一起, 一起出去 = 护卫 escort 护卫, 护送 这个单词按照我自己理解的反而好记住 es = ex = 出 cor = ...

  7. 多线程系列(十九) -Future使用详解

    一.摘要 在前几篇线程系列文章中,我们介绍了线程池的相关技术,任务执行类只需要实现Runnable接口,然后交给线程池,就可以轻松的实现异步执行多个任务的目标,提升程序的执行效率,比如如下异步执行任务 ...

  8. JSF之常用注解

    @ManagedBean 以托管 bean 的形式注册一个类实例,然后将其放入到使用其中一个 @...Scoped 注释指定的范围内.如果没有指定任何范围,JSF 将把此 bean 放入请求范围,如果 ...

  9. Java反序列化学习

    前言 早知前路多艰辛,仙尊悔而我不悔.Java反序列化,免费一位,开始品鉴,学了这么久web,还没深入研究Java安全,人生一大罪过.诸君,请看. 序列化与反序列化 简单demo: import ja ...

  10. 实时云渲染技术_如何助力VR虚拟现实走向成熟?

    近年来,虚拟现实(Virtual Reality, VR)技术在市场上的应用越来越广泛,虚拟现实已成为一个热门的科技话题.相关数据显示,2019年至2021年,我国虚拟现实市场规模不断扩大,从2019 ...