1、语法
merge into 的语法如下所示:
MERGE INTO [target-table] T
USING [source-table sql] S
ON([conditional expression] and […]…)
WHEN MATCHED THEN [UPDATE sql]
WHEN NOT MATCHED THEN [INSERT sql]
2、简单示例
merge into target t using source s on (t.id = s.aid)
when matched then
update set t.year = s.year
when not matched then
insert values(s.aid, s.name, s.year);
merge into target t
:指定目标表为target,并使用别名t。
using source s
:指定源数据集,其中包含要插入或更新的数据,并使用别名s。
on (t.id = s.aid)
:指定合并条件,当目标表的id与源数据集的aid相匹配时执行更新操作。
when matched then update set t.year = s.year
:指定当合并条件满足时执行更新操作。在这里,设置目标表的year列的值为源数据集中对应的year值。
when not matched then insert values(s.aid, s.name, s.year)
:指定当合并条件不满足时执行插入操作。在这里,将源数据集中的aid、name和year值插入到目标表中。
3、实际示例
MERGE INTO G_ASSET_INVENTORY_ACT_E AS target
USING (
VALUES
<foreach collection="list" item="item" separator=",">
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="#{item.srcid} != null">#{item.srcid},</if>
<if test="#{item.inventoryname} != null">#{item.inventoryname},</if>
<if test="#{item.assettagno} != null">#{item.assettagno},</if>
</trim>
</foreach>
) AS source (srcid,inventoryname,assettagno)
ON (target.srcid = source.srcid)
WHEN MATCHED THEN
UPDATE SET
target.srcid = source.srcid,
target.inventoryname = source.inventoryname,
target.assettagno = source.assettagno,
WHEN NOT MATCHED THEN
INSERT (srcid,inventoryname,assettagno)
VALUES (source.srcid,
source.inventoryname,
source.assettagno,
);
以下是对该代码的解释:
MERGE INTO G_ASSET_INVENTORY_ACT_E AS target
:指定目标表为G_ASSET_INVENTORY_ACT_E,并使用别名target。
USING (…) AS source (srcid,inventoryname,assettagno)
:指定源数据集,其中包含了要插入或更新的数据列(srcid、inventoryname、assettagno),并使用别名source。
ON (target.srcid = source.srcid)
:指定合并条件,当目标表的srcid与源数据集的srcid相匹配时执行更新操作。
WHEN MATCHED THEN UPDATE SET …
:指定当合并条件满足时执行更新操作。在这里,设置目标表的srcid、inventoryname和assettagno等列的值为源数据集中对应的值。
WHEN NOT MATCHED THEN INSERT …
:指定当合并条件不满足时执行插入操作。在这里,将源数据集中的srcid、inventoryname和assettagno等列的值插入到目标表中。
4、MySQL版本
使用ON DUPLICATE key update
insert into G_ASSET_INVENTORY_ACT_E
(srcid,inventoryname,assettagno)
values
<foreach collection="list" item="item" separator=",">
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="#{item.srcid} != null">#{item.srcid},</if>
<if test="#{item.inventoryname} != null">#{item.inventoryname},</if>
<if test="#{item.assettagno} != null">#{item.assettagno},</if>
</trim>
</foreach>
ON DUPLICATE KEY UPDATE
srcid = VALUES(srcid),inventoryname = VALUES(inventoryname),assettagno = VALUES(assettagno),