基本上我只想在目标行没有变化的情况下插入一组行。
我已经实现了一个阻塞步骤,等待处理所有行,然后再继续。在此之后,我想添加一个条件来检查是否有任何更改的数据,如果有任何中止,则进程会插入所有行。
有什么建议吗?
答案 0 :(得分:0)
如果我理解你的问题,你想要插入与目标行相同的行吗?这不会导致PK违规吗?
无论如何,从您的代码截屏开始,您似乎使用了合并行(差异)步骤,该步骤将为您提供标记为“新”,“已更改”,“相同”或“已删除”状态的行。 从这里你想要检查两件事:改变或相同
如果更改,则必须中止,如果相同,则插入
现在你使用一个简单的过滤步骤,其中status ='same'作为真实条件(即)在你的情况下插入流程
错误的情况会进入中止步骤。
虽然注意到即使发现一行被改变,整个转换也会被中止
答案 1 :(得分:0)
如果我理解你的用例,我不会使用“表输出”步骤进行此类移动。 “表输出”是数据仓库的一个很好的步骤,您通常会将数据插入到应该为空的表中,并且是更广泛流程的一部分。
或者,我会使用“执行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性能方面,它可能不是最有效的方式,但它看起来像是一个更好的实现用例。
答案 2 :(得分:0)
这似乎很容易,只需两步
试试这个: 步骤1:使用数据库查找步骤,查找关键列,并检索要比较的列,包括目标表中重复项的关键字段。
步骤2:使用过滤器步骤,此处将您从db look中检索到的所有字段与stream / table / source输入进行比较。像id(来自源输入)= id(来自目标)和名称(来自源输入)= name(来自目标),false条件指向Target表,而true表示虚拟测试。
注意:如果要填充表格键max + 1,则需要组合查找和更新步骤而不是表格输出
答案 3 :(得分:0)
最简单的方法是使用插入/更新步骤。不需要进行任何查询:如果该行存在则更新,如果不存在则创建新行。