MERGE语句
MERGE语句可以从一个或多个源表中选择记录,对目标表进行数据的插入或更新。将源表中的数据分别与目标表中的数据根据指定条件进行比较,如果匹配,则利用源表中的记录更新目标表中的记录,如果不匹配,则将源表中的记录插入目标表中。
使用MERGE语句操作时,可以将UPDATE、INSERT、DELETE操作融为一体,用户需要具有源表的SELECT对象操作权限以及目标表的INSERT、UPDATE对象权限。
MERGE语句在OLAP系统中应用比较广,在AP系统中,经常需要同时读取多个数据源,而其中的很多数据是重复的,所以可以使用MERGE语句有条件地进行积累的添加或修改。
示例
我们举个例子说明MERGE的用法:
-- 创建源表
create table tsrc(a int, b int);
insert into tsrc values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6);
-- 创建目标表
create table tdst(a int, b int);
insert into tdst values (2,0),(4,0),(7,0);
-- 执行MERGE操作
merge into tdst d -- 目标表
using tsrc s -- 源表
on (d.a = s.a) -- ON 决定MERGE语句执行更新操作还是插入操作的条件
when matched then -- 匹配则执行更新
update set b = s.b
when not matched then -- 不匹配则执行插入
insert (a,b) values(s.a,s.b);
-- 查询执行结果
postgres@postgres=# select * from tdst ;
a | b
---+---
7 | 0
1 | 1
2 | 2
3 | 3
4 | 4
5 | 5
6 | 6
(7 rows)