【问题标题】:Merge tables based on column validation基于列验证合并表
【发布时间】:2014-02-19 17:56:41
【问题描述】:

我有一个定期重新加载的临时表。此表中的数据必须转到目标表(完全相同的结构),但是,如果我有重复的值,它必须检查最后加载的数据并更新目标表。

例子:

TMP_DP_REGIAO

SG  NOME    LOADING_DATE
AM  RG_1102 19-FEB-14
RO  RG_1103 19-FEB-14
AP  RG_1104 19-FEB-14
TO  RG_1105 19-FEB-14
RO  RG_1106 19-FEB-14

加载后,这些数据应该转到TB_DP_REGIAO(正如我所说,具有相同的结构)。

重点是:

如果TMP 中的SG 已经存在于TB 中,SQL 必须验证TMP 中的这条记录是否具有比LOADING_DATE 中更大的LOADING_DATE。如果是这样,请更新TB。否则,忽略它。

有人可以帮忙解决这个问题吗?

提前致谢!

【问题讨论】:

    标签: sql oracle merge


    【解决方案1】:

    此 SQL 可以满足您的需求:

    merge into TB_DP_REGIAO B
    using TMP_DP_REGIAO P
    on (P.SG = B.SG)
    when matched then update set B.NOME = case when B.LOADING_DATE < P.LOADING_DATE then P.NOME else B.NOME end,
                                 B.LOADING_DATE = case when B.LOADING_DATE < P.LOADING_DATE then P.LOADING_DATE else B.LOADING_DATE end
    when not matched then insert(SG, NOME, LOADING_DATE) values(P.SG, P.NOME, P.LOADING_DATE)
    ;
    

    【讨论】:

    • 当我第二天运行它时,当 P.LOADING_DATE 提前一天时,我得到一个SQL Error: ORA-30926: unable to get a stable set of rows in the source tables。它告诉我Remove any non-deterministic where clauses and reissue the dml.。你知道发生了什么吗?这个查询对我来说似乎还不错。
    • 根据这个其他 SO 帖子 (stackoverflow.com/questions/2337271/…),这可能是由于 TMP_DP_REGIAO 在 SG 字段上有重复项(我认为 SG 是关键)。尝试检查重复...
    猜你喜欢
    • 2016-02-08
    • 2018-03-28
    • 2021-06-26
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 2017-07-23
    相关资源
    最近更新 更多