SQL语句中merge into的用法
一、merge into
1、语法
MERGE INTO table_name a
USING (table|view|sub_query) b
ON (join condition)
WHEN MATCHED THEN
UPDATE
SET col1 = col1_val1,
col2 = col2_val2
WHEN NOT MATCHED THEN
INSERT (column_list) VALUES (column_values);
其中,table_name 指的是更新的表,using()里边的指的是数据来源表/视图/子查询结果集,condition指的是连接条件。
如果满足连接条件,则更新字段;如果连接条件不满足,则停止更新进行插入。
2、例子
MERGE INTO table_1 S1
USING (SELECT
AFAX0201
,AFAX0003
,AFAX0203
from table_2 ) S2
on (S1.AFAX0201=S2.AFAX0201)
WHEN MATCHED THEN
UPDATE SET
S1.AFAX0003 = S2.AFAX0003
,S1.AFAX0203 = S2.AFAX0203
WHEN NOT MATCHED THEN
INSERT
(
S1.AFAX0201
,S1.AFAX0003
,S1.AFAX0203
)
VALUES
(
S2.AFAX0201
,S2.AFAX0003
,S2.AFAX0203
);
可省略的UPDATE或INSERT子句
MERGE INTO table_1 S1
USING (SELECT
AFAX0201
,AFAX0003
,AFAX0203
from table_2 ) S2
on (S1.AFAX0201=S2.AFAX0201)
WHEN MATCHED THEN
UPDATE SET
S1.AFAX0003 = S2.AFAX0003
,S1.AFAX0203 = S2.AFAX0203
;
MERGE INTO table_1 S1
USING (SELECT
AFAX0201
,AFAX0003
,AFAX0203
from table_2 ) S2
on (S1.AFAX0201=S2.AFAX0201)
WHEN NOT MATCHED THEN
INSERT
(
S1.AFAX0201
,S1.AFAX0003
,S1.AFAX0203
)
VALUES
(
S2.AFAX0201
,S2.AFAX0003
,S2.AFAX0203
);
二、在 PostgreSQL 中,我们可以使用 INSERT ON CONFLICT 语句。
INSERT INTO table_name (column1, column2, …)
VALUES (value1, value2, …)
ON CONFLICT (column)
DO UPDATE SET column1 = value1, column2 = value2, …;
如果主键冲突则执行update,否则插入数据。do后面也可以不做任何操作,do nothing
;
- table_name:要插入或更新数据的表的名称。
- column1, column2, …:要插入或更新的列的名称。
- value1, value2, …:要插入或更新的值。
- column:用于指定用于检查冲突的列。