Sql 合并更新时态

Sql 合并更新时态,sql,teradata,temporal,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临时合并更

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

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临时合并更新语句,它是否可能出现在Teradata临时合并更新语句中

我试过的非工作代码

SEQUENCED VALIDTIME 
MERGE INTO  test
USING    
(  
  sel * from incoming 
) H on id=H.id
when matched then
update  
set name = h.name
;
尝试dnoeths解决方案后更新: 删除:

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

所以我需要硬编码结束日期,直到你改变

非工作删除:

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

好的,您需要一个两步流程来维护ValidTime表,如下所示,依次执行ValidTime删除和非顺序ValidTime插入:

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

对于我给出的示例,这是有效的。你们能解释一下我上面提到的派生表的delete吗?谢谢这就是我学习它的方式,不要问我更多的细节:-但是它可以通过使用非顺序进行合并来进一步简化,我编辑了我的答案。可能没有其他方法了,我接受你的答案。谢谢