首页 > 其他分享 >MogDB/openGauss中merge的语法解析

MogDB/openGauss中merge的语法解析

时间:2024-04-01 14:46:25浏览次数:23  
标签:name MogDB merge year aid openGauss id select

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)

标签:name,MogDB,merge,year,aid,openGauss,id,select
From: https://www.cnblogs.com/helloopenGauss/p/18108360

相关文章

  • openGauss/MogDB-3.0.0 dcf测试(非om安装)
    openGauss/MogDB-3.0.0dcf测试(非om安装)本文出处:https://www.modb.pro/db/402037IP地址...LERDER...FOLLOWER...FOLLOWER一、安装openGauss安装依赖包yuminstall-ybzip2bzip2-develcurllibaio创建用户、组并创建目录groupaddomma-g20001useraddomm......
  • 关于openGauss中的虚拟索引
    关于openGauss中的虚拟索引作为曾经的Oracle资深使用者,对于Oracle11gR2版本推出的invisibleIndex感觉一直很良好;因为这对于大部分情况下做优化是比较友好的。实际上openGauss2.0版本中也提供了类似的功能,下面我们来进行简单测试。首先我们创建一个测试表用来验证ope......
  • openGauss关于PL/SQL匿名块调用测试
    openGauss关于PL/SQL匿名块调用测试一、原理介绍PL/SQL(ProcedureLanguage/StructureQueryLanguage)是标准SQL语言添加了过程化功能的一门程序设计语言。单一的SQL语句只能进行数据操作,没有流程控制,无法开发复杂的应用。PL/SQL语言是结合了结构化查询与数据库自身过......
  • openGauss数据库将磁盘表转换为MOT
    openGauss数据库将磁盘表转换为MOT一、将磁盘表转换为MOT方法磁盘表直接转换为MOT尚不能实现,这意味着尚不存在将基于磁盘的表转换为MOT的ALTERTABLE语句。目前MOT表也不支持rename,createasselect以及insertselect(普通表)的操作。将基于磁盘的表转换为MOT方......
  • MogDB/openGauss如何实现事务的rollback
    MogDB/openGauss如何实现事务的rollback本文出处:https://www.modb.pro/db/113262数据库最主要的功能就是存储数据,然而我们在进行数据库操作时,却很容易发生误操作数据的情况,那么在MogDB中该如何实现误操作数据恢复呢?本文通过具体示例简要介绍如何通过回滚还原到误操作前的状......
  • openGauss每日一练第6天
    学习地址https://www.modb.pro/course/133学习目标学习openGauss创建模式、修改模式属性和删除模式模式是一组数据库对象的集合,主要用于控制对数据库对象的访问课后作业1.创建一个名为tpcds的模式SQL文本:createschematpcds;\dntpcdsomm=#createschematpcds;C......
  • MogDB/openGauss数据库package关键字的两种用法
    MogDB/openGauss数据库package关键字的两种用法本文出处:https://www.modb.pro/db/237701package关键字在MogDB数据库里有两种用法:package包,分为PackageSpecification和PackageBody。注意:需要在Oracle兼容下(dbcompatibility=‘A’)package属性,用于存储过程重......
  • ODBC批量merge中出现主键冲突的分析
    ODBC批量merge中出现主键冲突的分析一、文档概括客户某个merge语句运行时,发生主键冲突报错。经分析,其原因如下:由于merge语句中,ON里的判断条件(谓词)中存在带精度定义的数字字段,在绑定变量传递过程中,驱动将数值高精度数字传过去,而数据库内的数据已经做了精度限制,导致在......
  • MogDB/OpenGauss数据库中通过参数控制抓取慢sql
    MogDB/OpenGauss数据库中通过参数控制抓取慢sql本文出处:https://www.modb.pro/db/221556mogdb数据库中可以通过打开相应的参数抓取慢sql,该参数为log_min_duratuion_statement。log_min_duration_statement参数说明:当某条语句的持续时间大于或者等于特定的毫秒数时,log_min......
  • MogDB学习笔记之 -- 了解pagewriter线程
    MogDB学习笔记之--了解pagewriter线程本文出处:https://www.modb.pro/db/183172在前面的MogDB学习系列中,我们了解了核心的bgwriter进程,今天继续来学习另外一个主要的线程,即pagewriter;首先来看下数据库相关的参数设置:postgres=#selectname,setting,category,context......