KINGBASE 兼容Oracle 语法,实现了merge into 的功能。以下以例子的形式,介绍merge into语法的使用。以下例子在V8R6 ,且 database_mode=oracle 环境下验证过,database_mode=pg 不支持merge into 语法。

一、创建测试数据

create table source_table(s_id integer,s_name char(9));
create table target_table(t_id integer,t_name char(9)); insert into source_table values(1,'s_a'),(2,'s_b');
insert into target_table values(1,'t_a'),(3,'t_c'); test=# select * from source_table ;
s_id | s_name
------+-----------
1 | s_a
2 | s_b
(2 rows) test=# select * from target_table ;
t_id | t_name
------+-----------
1 | t_a
3 | t_c
(2 rows)

二、测试例子

1、例子1

test=# begin;
BEGIN
test=# merge into target_table as t
test-# using source_table as s
test-# on (t.t_id=s.s_id)
test-# when matched then update set t.t_name=s.s_name
test-# when not matched then insert values(s.s_id,s.s_name);
MERGE 2 test=# select * from target_table order by t_id;
t_id | t_name
------+-----------
1 | s_a
2 | s_b
3 | t_c
(3 rows) test=# rollback;
ROLLBACK

注意:更新的列不能是ON 条件中被引用的列。

2、例子2

更新时可以通过WHERE 条件指明要更新的行,条件中既可以包含源表的列,也可以包含目标表的列,当指明WHERE 条件且条件为假时,则不更新。

test=# begin;
BEGIN
test=# merge into target_table as t
test-# using source_table as s
test-# on (t.t_id=s.s_id)
test-# when matched then update set t.t_name=s.s_name where t.t_id=3
test-# when not matched then insert values(s.s_id,s.s_name);
MERGE 1
test=# test=# select * from target_table order by t_id;
t_id | t_name
------+-----------
1 | t_a --没有被更新
2 | s_b
3 | t_c
(3 rows) test=# rollback;
ROLLBACK

3、例子3

test=# begin;
BEGIN
test=# merge into target_table as t
test-# using source_table as s
test-# on (t.t_id=s.s_id)
test-# when matched then update set t.t_name=s.s_name
test-# delete where t.t_name='s_a'
test-# when not matched then insert values(s.s_id,s.s_name);
MERGE 3
test=# select * from target_table order by t_id;
t_id | t_name
------+-----------
2 | s_b
3 | t_c
(2 rows) test=# rollback;
ROLLBACK

DELETE 子句只删除目标表和源表的ON 条件为真、并且是更新后的符合删除条件的记录,DELETE 子句不影响INSERT 项插入的行

三、Postgresql 实现类 merge into 的方法

test=# begin;
BEGIN
test=# with upsert as (
test(# update target_table
test(# set t_name = source_table.s_name
test(# from source_table
test(# where target_table.t_id = source_table.s_id
test(# returning target_table.*
test(# )
test-# insert into target_table select * from source_table
test-# where not exists (
test(# select 1
test(# from upsert b
test(# where source_table.s_id = b.t_id
test(# );
INSERT 0 1
test=# select * from target_table order by t_id;
t_id | t_name
------+-----------
1 | s_a
2 | s_b
3 | t_c
(3 rows) test=# rollback;
ROLLBACK

  

Merge Into 语法支持的更多相关文章

  1. merge into 语法缺陷

    merge into 语法缺陷? test001

  2. WebStorm ES6 语法支持设置&babel使用及自动编译

    一.语法支持设置 Preferences > Languages & Frameworks > JavaScript 二.Babel安装 1.全局安装 npm install -g ...

  3. 自己动手为Spark 2.x添加ALTER TABLE ADD COLUMNS语法支持

    SparkSQL从2.0开始已经不再支持ALTER TABLE table_name ADD COLUMNS (col_name data_type [COMMENT col_comment], .. ...

  4. oracle merge into语法

    oracle的merge into语法,在这种情况下: 基于某些字段,存在就更新,不存在就插入 不需要先去判断一下记录是否存在,直接使用merge into oerge into 语法: MERGE ...

  5. WebStorm ES6 语法支持设置

    ECMAScript 6是JavaScript语言的下一代标准,已经在2015年6月正式发布了.Mozilla公司将在这个标准的基础上,推出JavaScript 2.0.ES6的目标,是使得JavaS ...

  6. WebStorm ES6 语法支持设置和ES6语法的JS文件编译为ES5语法文件

    ECMAScript 6是JavaScript语言的下一代标准,已经在2015年6月正式发布了.Mozilla公司将在这个标准的基础上,推出JavaScript 2.0.ES6的目标,是使得JavaS ...

  7. Oracle中merge into语法

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

  8. Oracle—merge into语法

    oracle的merge into语法,在这种情况下: 基于某些字段,存在就更新,不存在就插入: 不需要先去判断一下记录是否存在,直接使用merge into merge into 语法: MERGE ...

  9. Windowns的GVIM添加markdown语法支持

    gvim 7.4中其实也是有对markdown的语法文件,但格式支持并不全面,如行业代码``就没有实现. 修改方案: 从github下载plasticboy的markdown语法版本,windowns ...

随机推荐

  1. UiPath存在元素Element Exists的介绍和使用

    一.Element Exists的介绍 使您能够验证UI元素是否存在,即使它不可见,输出的是一个布尔值 二.Element Exists在UiPath中的使用 1. 打开设计器,在设计库中新建一个Se ...

  2. [LINUX] 像电影里的黑客一样用 terminal 作为日常开发

    目录 1.效果预览 2.具体实现 2.1 定位鼠标位置 2.2 获取屏幕位置 2.3 计算鼠标在哪个窗口 2.4 1920x1080 平铺效果设计 2.5 1280x1024 平铺效果设计 3 代码 ...

  3. 【转载】vscode配置C/C++环境

    VScode中配置 C/C++ 环境 Tip:请在电脑端查看 @零流@火星动力猿 2022.4.12 1. 下载编辑器VScode 官网:https://code.visualstudio.com/( ...

  4. Collection子接口:List接口

    1. 存储的数据特点:存储序的.可重复的数据. 2. 常用方法:(记住)增:add(Object obj)删:remove(int index) / remove(Object obj)改:set(i ...

  5. Git的历史和安装Git及环境配置

    Git历史同生活中的许多伟大事物一样,Git 诞生于一个极富纷争大举创新的年代. Linux 内核开源项目有着为数众广的参与者.绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务 ...

  6. 【RocketMQ】消息的拉取

    RocketMQ消息的消费以组为单位,有两种消费模式: 广播模式:同一个消息队列可以分配给组内的每个消费者,每条消息可以被组内的消费者进行消费. 集群模式:同一个消费组下,一个消息队列同一时间只能分配 ...

  7. java 九九乘法表(for循环)

    package study5ran2yl.study; public class ForDemo01 { public static void main(String[] args) { int h; ...

  8. HashMap中的哈希函数分析

    首先我们要知道,在理想情况下的哈希表中,哈希函数生成的哈希值是value在数组中的下标,其范围是分布于负无穷到正无穷的整个实整数轴的.而在现实情况下,是不可能存在这么大的一个数组的.接下来分析Hash ...

  9. java中AOP的环绕通知

    pom.xml <dependencies> <dependency> <groupId>org.springframework</groupId> & ...

  10. Solution -「HDU」Professor Ben

    Description 有 \(Q\) 个询问.每次给定一个正整数 \(n\),求它的所有因数的质因数个数的和. Solution 就讲中间的一个 Trick. 我们定义正整数 \(x\) 有 \(f ...