我正在研究Informatica PowerCenter Designer 8.1.1
我有一个包含三列的源表,
PORT_ID
ISSUE_ID
MKT_VAL
我需要将源表中的数据同步到目标表,该目标表在不同的数据库中包含相同的三个表。
PORT_ID 与 ISSUE_ID
之间存在1:n的关系在执行此数据同步时,我必须执行DELETE,然后执行INSERT,原因是,映射到PORT_ID的ISSUE_ID的数量可以更改。让我们说,从源头和目标来看,数据就像这样:
PORT_ID ISSUE_ID
1 A
1 B
1 C
源中的数据更改为:
PORT_ID ISSUE_ID
1 A
1 B
1 D
因此,在我同步期间,我必须首先删除映射到PORT_ID = 1的所有行,然后插入传入记录。
我无法弄清楚如何在地图设计师中完成这项工作。有人可以给我一些意见吗?
答案 0 :(得分:1)
最常见的方法是使用预查询。如果port_id和issue_id在表中是唯一的,则可以使用....
delete from tgt_table
where (port_id, issue_id)
not in (select port_id, issue_id
from src_table
);
commit;
第二种方式:
如果可以将这两列添加为映射中的键,则可以将处理目标行“检查”为“插入,更新,删除”(全部三个),以确保目标数据与源数据。但是,在大多数情况下,业务规则比这更复杂,因此很少使用此功能。
另一个常见的实现是“根据目标表上的查找来标记要删除的行”。
Source -> Lookup (target_table) ->
exp (flag to see if the value exists) ->
mark for delete ->
Delete using update_strategy_transformation
答案 1 :(得分:0)
编写一个简单的存储过程,执行以下操作:
1)删除声明(Rajesh给出) (从tgt_table删除 where(port_id,issue_id) 不在(选择port_id,issue_id 来自src_table ); 承诺; )
2)插入声明
Insert into tgt_table where not in src_table
commit;
3)在映射中使用dummy作为源和目标,并使用STORED_PROCEDURE_TRANSFORMATION调用存储的proc。
答案 2 :(得分:0)
您可以在源表上创建动态查找。
您可以做些什么来创建动态查找,
- >转到查找属性,
- >检查动态查找缓存框
- >然后检查插入其他更新框。
一旦你这样做,一个新的端口NewLookupRow将出现在ports选项卡中。 您可以使用此端口检查记录是插入还是更新,并带有以下相应的值
0没有变化
1是插入
2是更新
现在您可以相应地更新目标。
希望这会有所帮助..
干杯。
答案 3 :(得分:0)
我认为我们不需要动态查找,因为要求源中没有重复..
为什么不定期查找并使用更新策略而不是删除和插入来更新记录?