这是一件很奇怪的事情,我不知道为什么。我创建了一个映射,该映射通过表达式转换数据,并基于对同一目标的查找将数据加载到目标(文件)中。
Source table
#CompanyName
Acne Lmtd
Acne Ltd
N/A
None
Abc Ltd
Abc Ltd
X
映射
Source
->Exp(trim..)
->Lookup(source.company_name
= tgt.company_name)
ReturnPort is CompId
-> filter(ISNULL(CompId))
-> Target
Compid (via sequence
gen)
CompName
上面的映射逻辑插入重复的公司名称,就像在源2 Abc Ltd中记录的那样,在目标中也重复相同的名称。我不知道为什么。我也尝试调试,条件是即使记录已插入目标中,companyid为null的过滤器中的条件评估为true。
另外,我认为可能是查找缓存的情况,我也启用了动态功能,但结果相同。它应该像一个SQL查询一样工作
select company_id
From lkptarget where
company_name
In (select company_name
from
Source)
因此,对于Abc Ltd,筛选条件应该导致结果为假
Isnull(company_id) false
但是,这是事实。如何通过查找而不使用不重复的方式获得唯一记录?
注意:使用的查找已经是动态查找
查找转换无法知道映射中进一步转换中会发生什么。它看不到目标本身的结果,因为在映射开始时使用与数据库的单独连接一次加载了查找缓存。即使您禁用了缓存(这意味着对每个Lookup输入行进行一次查询),在写入目标时也不会立即提交数据(因此对其他连接不可见)。
这就是使用动态Lookup缓存的原因,它通过向Lookup缓存中添加新行来工作。但是,您遇到的问题是:company_id
是在Lookup之后创建的(这是正确的位置),因此无法将其添加到Lookup缓存中。
我认为您可以配置Lookup以便:
Dynamic Lookup Cache
,Update Else Insert
和Insert Else Update
company_name
在源数据和查找数据之间进行比较company_id
,并将其与相应的查找字段相关联Disable in comparison
字段的复选框company_id
NewLookupRow
(当您选中Dynamic Lookup Cache
选项时显示),对于新行,其值应为1;对于具有更新的现有行,其值应为2(对于相同的行,其值为0)查找现在应该为第一个NewLookupRow = 1
输出Abc Ltd
,然后为第二个NewLookupRow = 0
输出。查找之后的过滤器应具有类似NewLookupRow = 1
的条件。
有关详细信息,您可以查看Informatica文档:https://docs.informatica.com/data-integration/data-services/10-2/developer-transformation-guide/dynamic-lookup-cache.html