Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';SQL脚本增量更新表的逻辑/设计是否很好?_Sql_Database_Teradata - Fatal编程技术网

什么';SQL脚本增量更新表的逻辑/设计是否很好?

什么';SQL脚本增量更新表的逻辑/设计是否很好?,sql,database,teradata,Sql,Database,Teradata,这张表大约有40000行,我想更新一下。这位同事说,最好是增量更新表,而不是完全删除和加载 因此,我尝试了一个脚本的设计和逻辑来实现这一点,但我的经验不足。我只是不知道增量更新表的效率和必要性 目前,仓库看起来是这样的:数据从源数据进入Teradata中的表(我们称之为T1)。然后它被发送到Teradata中的另一个表(我们称之为T2)中,并添加了一些字段,如timestamp。最后,出于安全原因,在最后一个表上构建了一个视图 因此,我考虑用T1中的数据创建一个临时/易失性表。这将包含脚本运行时

这张表大约有40000行,我想更新一下。这位同事说,最好是增量更新表,而不是完全删除和加载

因此,我尝试了一个脚本的设计和逻辑来实现这一点,但我的经验不足。我只是不知道增量更新表的效率和必要性

目前,仓库看起来是这样的:数据从源数据进入Teradata中的表(我们称之为T1)。然后它被发送到Teradata中的另一个表(我们称之为T2)中,并添加了一些字段,如timestamp。最后,出于安全原因,在最后一个表上构建了一个视图

因此,我考虑用T1中的数据创建一个临时/易失性表。这将包含脚本运行时的所有数据以及新记录。然后,检查整个表,查看T2中是否已经存在ID(主索引),如果不存在,则将其添加到另一个临时表中。然后以某种方式将第二个临时表与T2结合起来,覆盖T2并在其上构建一个视图

这有什么意义吗


还有可能会更新记录。因此,它们可能已经存在于T2中,但已经在T1的新版本中更新了数据。我认为比较从T1到T2的所有列的值会非常低效,但是想不出另一种方法来实现这一点,对于任何现代数据库来说,40000行的删除和插入应该是非常轻松的。更新同上

执行和增量删除/更新/插入的真正原因是,您可以在永久表中记录更改和时间戳行,以及N插入和/或上次更新的日期/时间。通常的技术是这样的:

  • 从临时表中不存在的永久表中删除行
  • 更新两个表中存在的行
  • 插入临时表中存在但永久表中不存在的行
  • 看看,这可能是这样的(不保证语法正确,因为我没有Teradata实例):

    有人可能会注意到,如果涉及依赖外键约束,则删除操作可能会有点麻烦


    您可能还注意到,在更新时,如果要检查列值的实际更改,where子句可能会变得有点复杂:如果没有任何更改,则更新行没有多大意义。

    有一个Teradata合并命令,您可能会发现它很有用,请查看此帖子:

    如果需要在更多列上进行匹配,请在on语句中输入and

    编辑:如果要使用MERGE,可能还需要使用类似nicholas帖子中的delete语句。

    “同事说最好以增量方式更新表,而不是完全删除并加载。”不一定。你能在不丢失信息的情况下用源数据替换T1吗?“增量更新”不同于“完全删除并加载”,基于你的源数据,你不能这样做#2。否则,这听起来像是一个简单的“updateelseinsert”策略,可以使用MERGE-INTO.Thank轻松实现。#1基本上是查找和删除从源数据中删除的行吗?
    delete permanent p
    where not exists ( select *
                       from temp t
                       where t.id = p.id
                     )
    update p
    from permanent p ,
         temp      t
    set ...
    where t.id = p.id
    
    insert permanent
    select ...
    from temp t
    where not exists ( select *
                       from permanent p
                       where p.id = t.id
                     )
    
    merge into merge_tmp as t using (select 1 as a,'stf' as b,'uuj' as c)  as s
    on t.a = s.a
    when matched then update set c = s.c
    when not matched then insert values (s.a,s.b,s.c);