记录应仅加载到场景中的目标

Posted

技术标签:

【中文标题】记录应仅加载到场景中的目标【英文标题】:Record should only be loaded to target on a scenario 【发布时间】:2020-01-31 16:41:02 【问题描述】:

我有两个表,一个阶段表和一个目标表。我希望我的目标表包含有效的 CustomerScore 值。目前,我们插入到暂存中并加载到我们的目标表中。我们不想加载无效值(-8.0000)。但是,如果我们的目标表中有一个具有有效值的 customerNumber,我们希望通过给它一个 customerScore (-8.0000) 来停用数字。这应该是该值唯一一次进入目标表,因此该 CustomerNumber 的记录必须已经在目标中,才能更新当前在目标表中的记录。我的创建语句如下

CREATE TABLE stg.CustomerAppreciation (
    CustomerId INT identity(1, 1)
    ,CustomerNumber VARCHAR(50)
    ,CustomerScore DECIMAL(5, 4)
    );

CREATE TABLE ods.CustomerAppreciation (
    CustomerId INT identity(1, 1)
    ,CustomerNumber VARCHAR(50)
    ,CustomerScore DECIMAL(5, 4)
    );

目前,我的目标表有两条记录,下面的每个值都属于我的创建表字段。

1     123      0.8468
2     143      1.0342 

现在说我们要停用 CustomerID = 2,因为有一条记录被插入到暂存中

3     143      -8.0000

现在应该在此 CustomerNumber 上更新目标表。使我的目标表看起来像:

1     123      0.8468
2     143      -8.0000

当 CustomerNumber 已经存在时,这应该是我们允许 -8.0000 进入表的唯一一次。如果目标表中不存在 customerNumber 并且由于某种原因在暂存中看到 -8.0000 它不应该被允许。我将如何编写一个更新查询来更新我的目标表中的记录,只有当这种情况存在并阻止 - 8.0000 如果不存在就进来?

【问题讨论】:

当要停用的记录 CustomerNumber = 143 进入暂存状态时,该 CustomerNumber 的先前记录是否仍在暂存表中?在一次数据导入运行期间,CustomerNumber 是否会在临时表中出现两次? 您标记了 SSIS,这是通过数据流中的查找对象完成的,其中一个路径具有“匹配”并导致更新,而一个路径是“不匹配”并导致插入。但是,您只想处理事物的更新方面,只是让“不匹配”在查找中消失 【参考方案1】:

假设 staging 表中每个客户编号仅包含一行(如果没有,则将其分组以显示最高客户 ID),您可以使用合并来执行此功能。在不检查确切语法的情况下,如下所示:

MERGE ods.CustomerAppreciation AS Target
USING (SELECT * FROM stg.CustomerAppreciation WHERE CustomerScore >= 0) AS Source   ON Target.CustomerNumber = Source.CustomerNumber
WHEN MATCHED
    -- choose your match criteria here
    --AND Source.CustomerId > Target.CustomerId 
    AND NOT EXISTS (SELECT Target.* INTERSECT SELECT Source.*)
THEN UPDATE
    SET Target.CustomerScore = Source.CustomerScore;

【讨论】:

合并是实现这一目标的唯一解决方案吗?如果目标表中没有具有与暂存匹配的有效数字的 CustomerNumber,我希望它防止加载无效值。但是如果有一个匹配我希望它更新那个设置它等于你在合并中所做的 有很多方法可以给这只特殊的猫剥皮,但大多数在功能上是相同的。在源表中使用Where CustomerScore >= 0 过滤器应该会阻止将无效值加载到目标表中。由于没有 WHEN NOT MATCHED BY Target 子句,因此您根本不会加载 Target 中不存在的值。您可以使用另一个合适的and... 条件添加该子句。如果这变得太复杂,您可以将其扩展为几个 IF [Condition] INSERT INTO Target 命令,如果这看起来更容易的话。 我想说第一步是只在源表中获取您想要的数据,即使这意味着使用子选择连接暂存表和目标表(使用左连接到目标表) .然后,您应该可以根据需要将其与任意数量的条件合并。【参考方案2】:

不确定我是否完全理解细节,但这里有一些语法应该至少可以帮助你入门......

BEGIN;
 MERGE ods.CustomerAppreciation AS X  
 USING (SELECT CustomerNumber,CustomerScore FROM stg.CustomerAppreciation) AS Y (CustomerNumber,CustomerScore)  
 ON (X.CustomerNumber = Y.CustomerNumber)  
 WHEN MATCHED /*AND Y.CustomerNumber = '-8.0000'*/ THEN
 UPDATE SET CustomerScore = Y.CustomerScore  
 WHEN NOT MATCHED BY X /*AND Y.CustomerNumber = '-8.0000'*/ THEN  
 INSERT (CustomerNumber,CustomerScore)  
 VALUES (Y.CustomerNumber,Y.CustomerScore)  
 OUTPUT $action, inserted.* INTO #MyTempTable;  
END;

【讨论】:

以上是关于记录应仅加载到场景中的目标的主要内容,如果未能解决你的问题,请参考以下文章

将对象移动到场景中的指定点?

Qt - 如何将坐标映射到场景中的图像像素

第一步是 THREE.js:尝试将搅拌机模型添加到场景中的问题

unity 3d发布的exe程序可以从外部(比如同文件夹下的一个fbx文件)读取模型到场景中吗?

Sprite Kit - 使用 Switch Case 将随机 Sprite 节点添加到场景中

在 Unity3d 中将游戏对象动态添加到场景中