Oracle:更新列IF仅限于它不在Merge语句的条件下

时间:2014-07-14 16:41:16

标签: sql oracle plsql data-warehouse

我在使用此Oracle Merge查询时遇到问题。

    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状态的字段无法更新。但是,我不确定作者是否只在评估真实或所有领域的领域中进行讨论。我希望有人可能对此有所了解,以及任何解决方法。

1 个答案:

答案 0 :(得分:2)

您可以使用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为真时,请使用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

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