【问题标题】:inserting records into a table if values from src have changed如果 src 中的值已更改,则将记录插入表中
【发布时间】:2016-07-14 16:28:14
【问题描述】:

我有一个 STG 表,我们每天从 2 个 SRC 表中截断并将值加载到 STG 表中。我在 STG 表中创建了一个更改标志 (Ch_Flg),这样我们就不会每天截断表,而是仅在 SRC 中的某些字段发生更改时将值插入 STG。

但是,由于 SRC 表直接加载到 STG 中,因此我需要一个临时表,我可以在其中存储所有 SRC 记录,并与 STG 检查记录是否已更改,并仅在这些记录已更改时才插入 STG。

例如,SRC1 表有(ID、姓名、标签、部门、部门、城市、电话、HireDate 等)列,而 SRC2 有(ID、姓名、能力、城市、电话等)列

我是否应该将 SRC 中的所有值加载到临时表中,然后将它们与 STG 表进行比较?还是有更有效的方法来做到这一点?

【问题讨论】:

    标签: sql sql-server sql-update sql-insert temp-tables


    【解决方案1】:

    您可以将它们加载到临时表中,然后执行类似的操作

    WITH SINGLES AS 
    (
     SELECT t1.ID
     FROM <sourcetablename> t1
     LEFT JOIN <desttablename> t2
     ON (t1.id = t2.id)
     WHERE t2.id IS NULL
     )
    
     INSERT <tabletherecordswillbeinserted>(ID, <otherfield>, <otherfield2>)
    
     SELECT S.id, S.<otherfield1>, s.<otherfield2>
     From singles S
     Left Join <sourcetablename> on S.id = <desttable>.id
     Where <desttable>.id Is Null
    

    您可能需要在代码中添加更改标志,但这是一般的想法,您可以将更改标志放在 CTE 语句中

    【讨论】:

    • 感谢您的结构。单身是怎么回事?
    • 这被称为“通用表表达式”或 CTE,它是一种收集特定数据集并用它做其他事情的方法。因此,在这种情况下,如果您在 With 中使用 select 语句并使用您的表运行它,您将从一个表而不是另一个表中取回所有内容。然后我们获取那组数据并将不存在的记录插入到目标表中。在您的情况下,我想您只对具有填充更改标志的记录感兴趣。因此,您可以自行更改记录,然后将它们插入到下方。
    • 编辑:我在脚本底部的所有“其他字段”都需要在 WITH 语句中的原始选择中。对此感到抱歉
    • 所以'with singles as'是CTE,而不是代码的一部分?我在写“With Singles As”时出现错误
    • 它是代码的一部分(请注意,单词“singles”出现在第二个选择脚本中),您可以将其命名为任何您想要的名称,只要您在第二个选择语句中更改名称.除非您正在运行所有代码,否则在运行它时会出现错误。尝试在没有“With Singles as”的情况下运行您拥有的第一个选择(只是选择),看看选择是否有效。然后从那里添加,希望这会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2014-03-08
    相关资源
    最近更新 更多