无法通过informatica中的查找加载不同的记录

问题描述 投票:0回答:2

这是一件很奇怪的事情,我不知道为什么。我创建了一个映射,该映射通过表达式转换数据,并基于对同一目标的查找将数据加载到目标(文件)中。

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

但是,这是事实。如何通过查找而不使用不重复的方式获得唯一记录?

注意:使用的查找已经是动态查找

enter image description here

sql oracle11g informatica informatica-powercenter
2个回答
0
投票

查找转换无法知道映射中进一步转换中会发生什么。它看不到目标本身的结果,因为在映射开始时使用与数据库的单独连接一次加载了查找缓存。即使您禁用了缓存(这意味着对每个Lookup输入行进行一次查询),在写入目标时也不会立即提交数据(因此对其他连接不可见)。

这就是使用动态Lookup缓存的原因,它通过向Lookup缓存中添加新行来工作。但是,您遇到的问题是:company_id是在Lookup之后创建的(这是正确的位置),因此无法将其添加到Lookup缓存中。

我认为您可以配置Lookup以便:

  • 您激活选项Dynamic Lookup CacheUpdate Else InsertInsert Else Update
  • 您使用company_name在源数据和查找数据之间进行比较
  • 您在查找之前创建了一个值为0的伪字段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


0
投票

这实际上是一个动态缓存问题,newLookupRow在重复项上被赋值为0,所以我在过滤器中将条件添加为ISNULL(COMPANYID)和NEWLOOKUPROW = 1终于奏效了。

enter image description here

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.