合并更新时间

时间:2014-06-11 19:29:27

标签: sql teradata temporal

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

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 Temporal Merge更新声明中使用?

我试过的非工作代码

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 );

1 个答案:

答案 0 :(得分:0)

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可能比插入/选择或更新更有效。