【问题标题】:Improving insert query for SCD2 solution改进 SCD2 解决方案的插入查询
【发布时间】:2022-12-01 02:33:57
【问题描述】:

我有两个插入语句。如果目标表中不存在 id,第一个查询是插入一个新行。第二个查询只有当joined id hash值不同(表示该行已经在源表中被更新)并且源表中的id不为null时才插入到目标表中。这些解决方案旨在用于我的 SCD2 解决方案,它将用于插入数十万行。我尽量不使用 MERGE 语句进行练习。

“当前”列值 1 表示该行是新行,0 表示该行已过期。稍后我使用此信息通过更新查询使目标表中的行过期。

除了索引之外,是否还有一种更有效的方法来改进我的插入查询,其方式类似于用于插入新/更新行的 SCD2 合并语句?

询问:

Query 1:
INSERT INTO TARGET
SELECT Name,Middlename,Age, 1 as current,Row_HashValue,id
from Source s
Where s.id not in (select id from TARGET) and s.id is not null

Query 2:
INSERT INTO TARGET
SELECT Name,Middlename,Age,1 as current ,Row_HashValue,id
FROM SOURCE s 
LEFT JOIN TARGET t ON s.id = t.id
AND s.Row_HashValue = t.Row_HashValue
WHERE t.Row_HashValue IS NULL and s.ID IS NOT NULL

【问题讨论】:

    标签: sql sql-server tsql etl data-warehouse


    【解决方案1】:

    您可以使用 WHERE NOT EXISTS,并且只有一个 INSERT 语句:

    INSERT INTO TARGET
    SELECT Name,Middlename,Age,1 as current ,Row_HashValue,id
    FROM SOURCE s 
    WHERE NOT EXISTS (
        SELECT 1
        FROM TARGET t 
        WHERE s.id = t.id
        AND s.Row_HashValue = t.Row_HashValue)
    AND s.ID IS NOT NULL;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-22
      • 2015-11-22
      相关资源
      最近更新 更多