用户工具

站点工具


编程积累:数据库:common:各种数据库中merge

ORACLE和DB2

MERGE在ORACLE和DB2数据库下的语法大致相同:

MERGE INTO DEST_TABLE DEST
USING
(
    SELECT * FROM SRC_TABLE
) SRC
ON
(
    DEST.FIELD = SRC.FIELD
)
WHEN NOT MATCHED THEN
    INSERT (INSERT_FIELDS) VALUES (VALUES)
WHEN MATCHED THEN
    UPDATE SET DEST.FIELD = VALUE

但有一点不同的是,ORACLE不允许UPDATE子句中需要更新的字段作为ON中的连接字段,DB2下则是可以的。

那么如果刚好出现上面的情况该怎么处理呢,就是说我们在匹配的情况下需要更新某个字段,而该字段刚好又需要用来作为连接字段,我们可以把匹配和不匹配的情况分开来写:

MERGE INTO DEST_TABLE DEST
USING
(
    SELECT * FROM SRC_TABLE
) SRC
ON
(
    DEST.FIELD = SRC.FIELD
)
WHEN NOT MATCHED THEN
    INSERT (INSERT_FIELDS) VALUES (VALUES)
MERGE INTO DEST_TABLE DEST
USING
(
    SELECT * FROM SRC_TABLE
) SRC
ON
(
    DEST.FIELD = SRC.FIELD
)
WHEN MATCHED THEN
    UPDATE SET DEST.FIELD = VALUE WHERE DEST.FIELD = SRC.FIELD

这样写需要注意顺序问题,先执行插入,再执行更新,否则数据被更新以后,执行插入时会因为数据的改变导致判断错误而错误的插入数据。

我们看到,被更新的字段不能放在ON中,该条件已经被移到UPDATE后作为UPDATE的条件了。

MYSQL

评论

请输入您的评论. 可以使用维基语法:
 
编程积累/数据库/common/各种数据库中merge.txt · 最后更改: 2018/09/17 08:58 由 eric