Merge Into 语法支持
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 语法支持的更多相关文章
- merge into 语法缺陷
merge into 语法缺陷? test001
- WebStorm ES6 语法支持设置&babel使用及自动编译
一.语法支持设置 Preferences > Languages & Frameworks > JavaScript 二.Babel安装 1.全局安装 npm install -g ...
- 自己动手为Spark 2.x添加ALTER TABLE ADD COLUMNS语法支持
SparkSQL从2.0开始已经不再支持ALTER TABLE table_name ADD COLUMNS (col_name data_type [COMMENT col_comment], .. ...
- oracle merge into语法
oracle的merge into语法,在这种情况下: 基于某些字段,存在就更新,不存在就插入 不需要先去判断一下记录是否存在,直接使用merge into oerge into 语法: MERGE ...
- WebStorm ES6 语法支持设置
ECMAScript 6是JavaScript语言的下一代标准,已经在2015年6月正式发布了.Mozilla公司将在这个标准的基础上,推出JavaScript 2.0.ES6的目标,是使得JavaS ...
- WebStorm ES6 语法支持设置和ES6语法的JS文件编译为ES5语法文件
ECMAScript 6是JavaScript语言的下一代标准,已经在2015年6月正式发布了.Mozilla公司将在这个标准的基础上,推出JavaScript 2.0.ES6的目标,是使得JavaS ...
- Oracle中merge into语法
merge into 语句就是insert和update的一个封装,简单来说就是: 有则更新,无则插入 下面说怎么使用 MERGE INTO table_Name T1(匿名) using (另外一 ...
- Oracle—merge into语法
oracle的merge into语法,在这种情况下: 基于某些字段,存在就更新,不存在就插入: 不需要先去判断一下记录是否存在,直接使用merge into merge into 语法: MERGE ...
- Windowns的GVIM添加markdown语法支持
gvim 7.4中其实也是有对markdown的语法文件,但格式支持并不全面,如行业代码``就没有实现. 修改方案: 从github下载plasticboy的markdown语法版本,windowns ...
随机推荐
- UiPath存在元素Element Exists的介绍和使用
一.Element Exists的介绍 使您能够验证UI元素是否存在,即使它不可见,输出的是一个布尔值 二.Element Exists在UiPath中的使用 1. 打开设计器,在设计库中新建一个Se ...
- 有关于weiphp2.00611上传sae的一些注意(图片上传解决方案)
一.安装中注意的事项 安装时使用的系统为weiphp2.0611 版本 1.将所有文件上传到代码库中 2.按照步骤进行安装weiphp,注意在数据库导入的时候需要手动导入. ...
- 宝塔Linux面板安装教程
宝塔Linux面板安装教程 安装要求: 内存:512M以上,推荐768M以上(纯面板约占系统60M内存) 硬盘:300M以上可用硬盘空间(纯面板约占20M磁盘空间) 系统:CentOS 7.1+ (U ...
- windows10 安装MySQL ZIP版本
今天重新学习了一下MySQL,但是呢刷题网站不知道为什么很卡,输入容易卡死崩溃,于是乎想在win10上面进行安装进行练习. 发现电脑里面没有,于是进行安装. 1.首先下载MySQL https://d ...
- Java之取余操作 "%"
取模运算与取余运算两个概念有重叠的部分但又不完全一致.主要的区别在于对负整数进行除法运算时操作不同. 对于整形数a,b来说,取模运算或者求余运算的方法都是: 1.求 整数商 c = a / b: 2. ...
- while循环&&连接的两个条件
做题的时候出现这种情况,把while中用&&连接的两个条件交换一下就会报错. 原因是 while 中是先检查第一个条件,如果第一个就为false就不看下一个了.如果第一个是true再检 ...
- Mac安装 Scrapy 报错 No local packages or working download links found for incremental>=16.10.1
证书原因: wget http://curl.haxx.se/ca/cacert.pem mv cacert.pem ca-bundle.crt sudo mkdir -p /etc/pki/tls/ ...
- Object类中wait代餐方法和notifyAll方法和线程间通信
Object类中wait代餐方法和notifyAll方法 package com.yang.Test.ThreadStudy; import lombok.SneakyThrows; /** * 进入 ...
- 丽泽普及2022交流赛day15 社论
前言 link 太牛逼了,补完我一定放代码 . orz 越看越牛逼 orz . 时间复杂度都是口胡,不要信 . 以下是目录 目录 目录 前言 A 题面 题解 代码 B 题面 题解 代码 C 题面 题解 ...
- 题解 P4999 【烦人的数学作业】
数位 dp. 设 \(dp_{q,i}\)(\(i\in\{0,1,2,3,4,5,6,7,8,9\}\))为 \(1\sim q\) 中 \(i\) 出现的次数,\(1\sim q\) 的数字和显然 ...