无法通过在 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 Cache
、Update Else Insert
和 Insert 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
终于成功了。
这是一件非常奇怪的事情,我不知道为什么。我创建了一个映射,它通过表达式转换数据并根据对同一目标的查找将数据加载到目标(文件)中。
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 Cache
、Update Else Insert
和Insert 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 终于成功了。