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 语句的条件下的主要内容,如果未能解决你的问题,请参考以下文章