一、背景
当我们需要将一张表的数据合并到另一张表中时,可以使用Oracle中的MERGE INTO语句。它可以根据指定的条件将数据插入目标表中,如果数据已存在,则更新目标表中的数据。
二、详细用法
下面是MERGE INTO语句的详细用法:
1. 指定目标表和源表:
MERGE INTO target_table
USING source_table
其中,target_table是要合并数据的目标表,source_table是要从中获取数据的源表。
2. 指定条件:
ON (condition)
condition是用于匹配源表和目标表的条件。这个条件可以是简单的等值条件,也可以是复杂的条件表达式。
3. 定义匹配时的操作:
WHEN MATCHED THEN
UPDATE SET column1 = value1, column2 = value2, ...
当源表和目标表匹配时,执行的操作是更新目标表中的数据。可以使用SET关键字指定要更新的列和对应的值。
4. 定义不匹配时的操作:
WHEN NOT MATCHED THEN
INSERT (column1, column2, ...)
VALUES (value1, value2, ...)
当源表和目标表不匹配时,执行的操作是将源表中的数据插入到目标表中。使用INSERT关键字指定要插入的列和对应的值。
需要注意的是,当进行更新操作时,只有匹配的行才会被更新。而当进行插入操作时,只有不匹配的行才会被插入。
5. DEMO:
下面是一个完整的例子,将员工表中的数据合并到目标表中:
MERGE INTO target_table
USING source_table
ON (target_table.employee_id = source_table.employee_id)
WHEN MATCHED THEN
UPDATE SET target_table.salary = source_table.salary
WHEN NOT MATCHED THEN
INSERT (employee_id, salary)
VALUES (source_table.employee_id, source_table.salary);
以上是Oracle中MERGE INTO语句的详细用法,可以根据具体需求进行调整和扩展。
6. XML语法:
<insert id="batchSave" parameterType="java.util.List">
MERGE INTO PERSON t1
USING (
<foreach collection="list" item="item" index="index" separator="union" >
select
#{item.id,jdbcType=VARCHAR} ID,
#{item.name,jdbcType=VARCHAR} NAME,
#{item.age,jdbcType=VARCHAR} AGE,
#{item.address,jdbcType=VARCHAR} ADDRESS,
#{item.phone,jdbcType=VARCHAR} PHONE,
#{item.hoppy,jdbcType=VARCHAR} HOPPY,
#{item.createTime,jdbcType=TIMESTAMP} CREATE_TIME
from dual
</foreach>
) t2
ON (
t1.ID = t2.ID
AND t1.AGE = t2.AGE
)
WHEN MATCHED THEN
UPDATE SET t1.CREATE_TIME = t2.CREATE_TIME
WHEN NOT MATCHED THEN
INSERT
(ID, NAME, AGE, ADDRESS, PHONE, HOPPY, CREATE_TIME)
VALUES
(t2.ID, t2.NAME, t2.AGE, t2.ADDRESS, t2.PHONE, t2.HOPPY, t2.CREATE_TIME)
</insert>