基本上我只想在目标行没有更改的情况下插入一组行。
我已经实施了一个阻塞步骤来等待所有行在继续之前被处理。在此之后,我想添加一个条件来检查是否有任何更改的数据以及是否有任何中止进程,否则插入所有行。
有什么建议么?
这似乎很容易,只需 2 个步骤
试试这个: 第 1 步:使用数据库查找步骤,查找关键列,并检索要比较的列,包括目标表中的关键字段以查找重复项。
第 2 步:使用过滤器步骤,在这里将您从数据库中检索到的所有字段与流/表/源输入输入进行比较。像 id (from source input) = id (from target) and name (from source input) = name (from target) , false 条件指向 Target 表,true 指向 dummy 用于测试。
注意:如果要填充表键 max + 1,则使用组合查找和更新步骤而不是表输出
如果我正确理解您的问题,如果它们与目标中的行相同,您想插入行吗?这不会导致违反PK吗?
无论如何,从您的代码屏幕截图来看,您似乎已经使用了合并行(差异)步骤,该步骤将为您提供标记为“新”、“已更改”、“相同”或“已删除”状态的行。从这里您要检查两件事:已更改或相同
如果它被改变,你必须中止,如果它是相同的,你将插入
现在,您使用一个简单的过滤步骤,将 status = 'identical' 作为插入流的真实条件(即)
错误条件将进入中止步骤。
虽然请注意,即使发现单行被更改,整个转换也会被中止
如果我正确理解您的用例,我不会使用“表格输出”步骤进行此类移动。“表输出”是数据仓库的重要一步,您通常将数据插入到应该为空的表中,并且是更广泛过程的一部分。
或者,我会使用“执行 SQL 脚本”来调整 INSERT 以满足您自己的需要。认为这是您想要的 SQL 语句(本例中的 PostgreSQL 语法):
INSERT INTO ${TargetTable}
(contact_id, request_id, event_time, channel_id)
VALUES ('?', '?', '?', '?')
WHERE
NOT EXISTS (
SELECT contact_id, request_id, event_time, channel_id FROM ${TargetTable}
WHERE contact_id = '?' AND
-- and so on...
);
:
SQL 性能方面,它可能不是最有效的方法,但在我看来,它是您用例的更好实现。
最简单的方法是使用插入/更新步骤。不需要进行任何查询:如果行存在则更新,如果不存在则创建新行。