Oracle:更新列,如果它不在 Merge 语句的条件下

Posted

技术标签:

【中文标题】Oracle:更新列,如果它不在 Merge 语句的条件下【英文标题】:Oracle: updating column IF ONLY it is not in condition of Merge statement 【发布时间】:2014-07-14 16:41:15 【问题描述】:

我在处理这个 Oracle 合并查询时遇到了问题。

    merge into NEW_DOCTORS NP
    USING OLD_DOCTORS MD
    on (MD.SSN=NP.SSN OR MD.NPI=NP.NPI OR MD.PIN=NP.PIN)
    WHEN MATCHED THEN
    UPDATE SET 
    NP.othervalues=MD.othervalues
    NP.PIN/SSN/NPI=MD.PIN/SSN/NPI (**update two of these three that did not return TRUE in the above ON condition)
    WHEN NOT MATCHED THEN
    insert(NP.SSN,NP.NPI,NP.PIN,NP.other_values)
    values(MD.SSN,MD.NPI,MD.PIN,MD.other_values)

这可能吗?谢谢!

编辑:我问是因为我在某处读到处于 ON 条件的字段无法更新。但是,我不确定作者是否仅在评估 true 的字段或所有字段的上下文中谈论。我希望有人可能对此有所了解,以及任何解决方法。

【问题讨论】:

如果更新所有这些,只需覆盖相同的值。 【参考方案1】:

你可以使用CASE WHEN ...

UPDATE SET 
NP.othervalues=MD.othervalues
,NP.PIN = CASE WHEN (MD.SSN=NP.SSN OR MD.NPI=NP.NPI) THEN MD.PIN ELSE NP.PIN END
,--add here the 2 others

这意味着,当 MD.SSN=NP.SSN OR MD.NPI=NP.NPI 为 true 时,将 NP.PIN 更新为 MD.PIN 否则让相同的值 NP.PIN

或者你可以做 3 个不同的 MERGE,这样它会更具可读性。

编辑

想一想,如果你只在这不是同一个值时更新(因为它只会加入相同的值)你可以直接用 MD 表值更新它们。

这样做:

NP.othervalues=MD.othervalues
,NP.PIN=MD.PIN
,NP.SSN=MD.SSN
,NP.NPI=MD.NPI

如果它们匹配,则更新将保持相同的值,否则将更新该值。

【讨论】:

如果我没记错的话,您不能更新属于 ON 条件的字段。由于我在这里使用 OR 并且其中一些条件没有被评估,我希望了解它们是否仍然可以更新。我现在没有机会检查,但我相信您所做的 3 个作业中至少有一个可能会出错。.. 你可能是对的,我认为他们有很多解决方案,尝试使用 3 种不同 MERGE 的技巧。解决方案取决于您的数据内容是什么,无论如何,如果您遇到特定问题,我会尽力帮助您。 我最终进行了 3 种不同的合并。它不漂亮,但它有效。

以上是关于Oracle:更新列,如果它不在 Merge 语句的条件下的主要内容,如果未能解决你的问题,请参考以下文章

Oracle MERGE语句

oracle merge into用法

Oracle 使用MERGE INTO 语句更新数据

Oracle 使用MERGE INTO 语句更新数据

Oracle 使用MERGE INTO 语句更新数据

在oracle中使用merge into实现更新和插入数据