MERGE
功能描述
从其他数据源中选择行对目标表或者视图的数据进行更新或插入。
通过指定更新、插入目标表或视图的条件,可以组合多个操作。
注意事项
- 在ON子句条件、UPDATE子句、INSERT子句中,如果出现字段有二义性,则必须指明是哪张表的字段。
- 不允许ROWNUM出现在ON、INSERT WHERE、UPDATE WHERE子句中。
语法结构
MERGE INTO [ schema_name. ] table_name USING { [ schema_name. ] table_name | [ schema_name. ] view_name | select_query } [ alias ] ON ( condition ) { WHEN MATCHED THEN UPDATE SET column_name = expression [ , ... ] [ WHERE ( condition ) ] |WHEN NOT MATCHED THEN INSERT ( column_name [ , ... ] ) VALUES ( expression [ , ... ] ) [ WHERE ( condition ) ] }[ ... ]参数说明
- INTO table_name
更新或插入的目标表。
- USING子句
指定要更新或插入的数据源,可以是表、视图或者查询的结果。
view_name
视图名称。
select_query
子查询。
- alias
给表起一个临时的表别名,以便被其余的查询引用。别名用于缩写或者在自连接中消除歧义。如果提供了别名,它就会完全隐藏表的实际名字。
- ON (condition)
合并条件。评估目标表中的每一行,如果结果为true,则使用源表中的相应数据更新该行。如果任何行的结果为false,则将源表中相应的行插入到目标表中。
condition
合并条件。
- WHEN MATCHED THEN UPDATE SET column_name = expression [ , ... ] [ WHERE ( condition )]
满足合并条件时,使用源表中的相应数据更新行数据。
column_name
列名称。
expression
表达式。
- WHEN NOT MATCHED THEN INSERT ( column_name [ , ... ] ) VALUES ( expression [ , ... ] ) [ WHERE ( condition )]
不满足合并条件时,将源表中相应的行插入到目标表中。
column_name
列名称。
expression
表达式。
示例
从new_bonuses_depa1中选择行更新表bonuses_depa1的数据。
--删除表bonuses_depa1。 DROP TABLE IF EXISTS bonuses_depa1;--删除表new_bonuses_depa1。 DROP TABLE IF EXISTS new_bonuses_depa1;--创建表bonuses_depa1。 CREATE TABLE bonuses_depa1(staff_id INT NOT NULL, staff_name CHAR(50), job VARCHAR(30), bonus NUMBER);--创建表new_bonuses_depa1。 CREATE TABLE new_bonuses_depa1(staff_id INT NOT NULL, staff_name CHAR(50), job VARCHAR(30), bonus NUMBER);--向表bonuses_depa1中插入数据。 INSERT INTO bonuses_depa1(staff_id, staff_name, job, bonus) VALUES(23,'wangxia','developer',5000); --向表bonuses_depa1中插入数据。 INSERT INTO bonuses_depa1(staff_id, staff_name, job, bonus) VALUES(24,'limingying','tester',7000); --向表bonuses_depa1中插入数据。 INSERT INTO bonuses_depa1(staff_id, staff_name, job, bonus) VALUES(25,'liulili','quality control',8000); --向表bonuses_depa1中插入数据。 INSERT INTO bonuses_depa1(staff_id, staff_name, job, bonus) VALUES(29,'liuxue','tester',8000); --向表bonuses_depa1中插入数据。 INSERT INTO bonuses_depa1(staff_id, staff_name, job, bonus) VALUES(21,'caoming','document developer',11000); --提交。 COMMIT;--查询表bonuses_depa1的数据。 SELECT * FROM bonuses_depa1; STAFF_ID STAFF_NAME JOB BONUS ------------ -------------------------------------------------- ------------------------------ ---------------------------------------- 23 wangxia developer 5000 24 limingying tester 7000 25 liulili quality control 8000 29 liuxue tester 8000 21 caoming document developer 11000 5 rows fetched.--向表new_bonuses_depa1中插入记录1。 INSERT INTO new_bonuses_depa1(staff_id, staff_name, job, bonus) VALUES(23,'wangxia','developer',7000); --向表new_bonuses_depa1中插入记录2。 INSERT INTO new_bonuses_depa1(staff_id, staff_name, job, bonus) VALUES(27,'wangxuefen','document developer',7000); --向表new_bonuses_depa1中插入记录3。 INSERT INTO new_bonuses_depa1(staff_id, staff_name, job, bonus) VALUES(28,'denghui','quality control',8000); --向表new_bonuses_depa1中插入记录4。 INSERT INTO new_bonuses_depa1(staff_id, staff_name, job, bonus) VALUES(25,'liulili','quality control',10000); --向表new_bonuses_depa1中插入记录5。 INSERT INTO new_bonuses_depa1(staff_id, staff_name, job, bonus) VALUES(21,'caoming','document developer',12000); --提交事务。 COMMIT;--查询表new_bonuses_depa1的数据。 SELECT * FROM new_bonuses_depa1; STAFF_ID STAFF_NAME JOB BONUS ------------ -------------------------------------------------- ------------------------------ ---------------------------------------- 23 wangxia developer 7000 27 wangxuefen document developer 7000 28 denghui quality control 8000 25 liulili quality control 10000 21 caoming document developer 12000 5 rows fetched.--从new_bonuses_depa1中选择行更新表bonuses_depa1的数据。 MERGE INTO bonuses_depa1 BD1 USING new_bonuses_depa1 NBD1 ON (BD1.staff_id = NBD1.staff_id) WHEN MATCHED THEN UPDATE SET BD1.bonus = NBD1.bonus WHEN NOT MATCHED THEN INSERT (staff_id, staff_name, job, bonus) VALUES (NBD1.staff_id, NBD1.staff_name, NBD1.job, NBD1.bonus);--查询表bonuses_depa1的数据。 SELECT * FROM bonuses_depa1; STAFF_ID STAFF_NAME JOB BONUS ------------ -------------------------------------------------- ------------------------------ ---------------------------------------- 23 wangxia developer 7000 24 limingying tester 7000 25 liulili quality control 10000 29 liuxue tester 8000 21 caoming document developer 12000 27 wangxuefen document developer 7000 28 denghui quality control 8000 7 rows fetched.「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」关注作者【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。评论




