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

Unable to load distinct records via lookup in informatica

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

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,过滤条件的结果应该是 false

  Isnull(company_id) false

但是,这正在成为现实。如何在不使用 distinct 的情况下通过查找获得唯一记录?

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

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

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

我认为您可以配置查找,以便:

  • 您激活选项 Dynamic Lookup CacheUpdate Else InsertInsert Else Update
  • 您使用 company_name 来比较源数据和查找数据
  • 您在 Lookup 之前创建一个值为 0 的假字段 company_id 并将其关联到相应的 Lookup 字段
  • 您选中 company_id 字段的复选框 Disable in comparison
  • 然后您可以使用预定义字段 NewLookupRow(当您选中 Dynamic Lookup Cache 选项时出现),新行的值为 1,更新的现有行的值为 2 (0对于相同的行)

查找现在应该为第一个 Abc Ltd 输出 NewLookupRow = 1,然后为第二个输出 NewLookupRow = 0。 Lookup 之后的过滤器应具有类似 NewLookupRow = 1.

的条件

有关详细信息,您可以查看 Informatica 文档: https://docs.informatica.com/data-integration/data-services/10-2/developer-transformation-guide/dynamic-lookup-cache.html

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