当源表中不存在相关行时更新

Posted

技术标签:

【中文标题】当源表中不存在相关行时更新【英文标题】:Update when relevant rows are not present in the source table 【发布时间】:2013-01-10 10:29:25 【问题描述】:

我有一个这样的合并语句:

MERGE DESTINATION
USING SOURCE WHERE <Some_Conditions>
WHEN MATCHED AND <Some_Conditions> THEN DELETE
WHEN MATCHED UPDATE
WHEN NOT MATCHED INSERT 

这工作正常,但我还有一个条件,即当源中不存在它们的条目时,我必须更新目标中的行。

例如

来源

Column1 Column2 Column3
-----------------------
A        A       A
B        B       B

目的地

Column1 Column2 Column3
-----------------------------------
B        B       <Some_Calculation>
D        D       <Some_Calculation>

现在,由于D 的源中没有行,我必须通过一些计算修改目标中的Column 3。但是当行匹配与否时,合并只给出deleteupdateinsert 这三个选项。

如何在上面的语句中实现这个功能?

编辑

在下面用我的 cmets 编辑问题:

在上面给出的示例中,它正在运行,然后它正在更新B 并将A 插入到目标表中。但我也想更新D,即使它不在源表中

【问题讨论】:

@Mahmound 在上面我给出的示例中,它正在运行,然后它正在更新 B 并在目标表中插入 A。但即使源表中不存在 D,我也想更新它 【参考方案1】:

也许阅读MERGE的文档:

MERGE 
[ TOP ( expression ) [ PERCENT ] ] 
[ INTO ] <target_table> [ WITH ( <merge_hint> ) ] [ [ AS ] table_alias ]
USING <table_source> 
ON <merge_search_condition>
[ WHEN MATCHED [ AND <clause_search_condition> ]
    THEN <merge_matched> ] [ ...n ]
[ WHEN NOT MATCHED [ BY TARGET ] [ AND <clause_search_condition> ]
    THEN <merge_not_matched> ]
[ WHEN NOT MATCHED BY SOURCE [ AND <clause_search_condition> ]
    THEN <merge_matched> ] [ ...n ]
...

WHEN NOT MATCHED BY SOURCE 是你所需要的

【讨论】:

完美!一切都在那里:)

以上是关于当源表中不存在相关行时更新的主要内容,如果未能解决你的问题,请参考以下文章

HSQLDB 如果不存在则插入,如果存在则更新

Redshift:当源表中有自动排序键时,创建表失败

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

仅当表中不存在该值时才更新 SQL 列

如果 mysql 数据库中的表中不存在,则更新或插入多条记录

如何不选择其他表中不存在的行