Oracle MERGE NOT MATCHED THEN MATCHED THEN UPDATE 可能吗?

Posted

技术标签:

【中文标题】Oracle MERGE NOT MATCHED THEN MATCHED THEN UPDATE 可能吗?【英文标题】:Is Oracle MERGE NOT MATCHED THEN UPDATE possible? 【发布时间】:2017-08-10 17:17:07 【问题描述】:

当源表中不存在的记录存在于目标表中时,我们希望将 IS_DEL 位设置为 1。

是否可以通过 WHEN NOT MATCHED 子句使用 MERGE 语句,但使其执行 UPDATE?

尝试这样做时,我收到“ORA-00905:缺少关键字”消息。

MERGE
INTO    AMEPSA.ENTERPRISE_LOCATION trg
USING   (
        SELECT C.LOCATION_KEY as LOCATION_KEY
        FROM AMEPSA.ENTERPRISE_LOCATION C
            INNER JOIN AMESTAGE.VW_LOCATION L ON C.REC_SRC_KEY_CD = L.LOCATION_ID    
        WHERE C.CURR_REC_IND = 'Y'
        ) src
ON      (trg.LOCATION_KEY = src.LOCATION_KEY)
WHEN NOT MATCHED THEN UPDATE
    SET trg.IS_DEL = 1

“WHEN NOT MATCH”子句是否只支持“THEN INSERT”?

【问题讨论】:

看:***.com/questions/10539627/… WHEN MATCHED THEN UPDATE 更新匹配的行。当没有匹配项时,您希望UPDATE 影响哪些行? 如果没有匹配,你会更新什么? 如果没有匹配则尝试更新目标表。如果目标表中存在 ID 而源表中不再存在,则尝试在目标表中设置 IS_DEL 位 = 1。 【参考方案1】:

From the documentation:

使用 MERGE 语句从一个或多个源中选择行以更新或插入到表或视图中。您可以指定条件来确定是更新还是插入到目标表或视图中。

该语法在源表 (src) 中查找在目标表 (trg) 中有或没有匹配行的行。如果有匹配的目标行,那么它会更新它;如果没有匹配的行,则在目标表中插入新行。

它不会也不能在目标表中查找与源表不匹配的行 - 这是您要识别和更新的内容。

WHEN MATCHEDWHEN NOT MATCHED 的语法图也清楚地表明您不能使用 WHEN NOT MATCHED THEN UPDATE

【讨论】:

【参考方案2】:

是的,您只能在不匹配时插入。请参阅oracle merge 中的确切选项。

条件可以引用数据源或目标表。如果条件不成立,则数据库在将行合并到表时跳过更新操作。

【讨论】:

以上是关于Oracle MERGE NOT MATCHED THEN MATCHED THEN UPDATE 可能吗?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle Merge语句

Oracle merge into 的效率问题

Oracle(merge)

ORACLE关于merge into用法!

ORACLE11g update和merge into 的区别

oracle merge into 语法