【问题标题】:Merge update Temporal合并更新时间
【发布时间】:2014-08-01 23:48:05
【问题描述】:

表测试中的现有数据:(时态表)

id name    valid_dt
1  cat     2012-06-16 - 9999-12-31

传入表:(时间)

  id name  valid_dt
  1  bat   2013-12-28 - 9999-12-31

合并更新后,测试表应该有

id name valid_dt
1 cat    2012-06-16 - 2013-12-28
1 bat    2013-12-28 - 9999-12-31

如果我今天运行 Teradata 临时合并更新语句,是否有可能?

我尝试过的非工作代码

SEQUENCED VALIDTIME 
MERGE INTO  test
USING    
(  
  sel * from incoming 
) H on id=H.id
when matched then
update  
set name = h.name
;

更新尝试 dnoeths 解决方案后: 删除:

在我的真实传入表中,一些记录实际上已关闭。

所以我需要硬编码结束日期作为 until_changed

非工作删除:

sequenced validtime
delete from test where (cust_id,name) in
(nonsequenced validtime
 select id,name,period(begin(valid_dt),until_changed)
from incoming );

【问题讨论】:

    标签: sql teradata temporal


    【解决方案1】:

    AFAIK 您需要一个两步过程来维护这样的 ValidTime 表,一个 Sequenced ValidTime DELETE 后跟一个 NonSequenced ValidTime INSERT:

    SEQUENCED VALIDTIME 
    DELETE test FROM incoming
    WHERE test.id = incoming.id
    ;NONSEQUENCED VALIDTIME
    INSERT INTO test SELECT * FROM incoming;
    

    应该可以将插入/选择替换为合并,但您仍然需要先删除:

    NONSEQUENCED VALIDTIME 
    MERGE INTO  test
    USING    
    (  
      sel * from incoming 
    ) H ON test.id=H.id
    AND test.valid_dt = h.valid_dt
    WHEN NOT MATCHED THEN
    INSERT (H.id, H.name, h.valid_dt)  
    

    与非时间 DML 一样,MERGE 可能比插入/选择或更新更有效。

    【讨论】:

    • 这适用于我给出的示例。您能否像我上面提到的那样对派生表的删除有所了解?谢谢!!
    • 这只是我学到的,不要问我更多细节 :-) 但是可以通过使用 NONSEQUENCED 来进一步简化 MERGE,我编辑了我的答案。
    • 可能没有别的办法,我接受你的回答。谢谢!!
    猜你喜欢
    • 1970-01-01
    • 2013-04-13
    • 2016-09-05
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 2016-06-04
    相关资源
    最近更新 更多