Невозможно загрузить отдельные записи с помощью поиска в informatica - PullRequest
0 голосов
/ 02 ноября 2019

Это очень странная вещь, я не знаю почему. Я создал отображение, которое преобразует данные с помощью выражения и загружает данные в цель (файл) на основе поиска по той же цели.

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 тоже самое повторяются и в target. Я не знаю почему. Я попытался отладить, а условие оценивается как истинное в фильтре, что companyid равен нулю, даже если запись уже вставлена ​​в цель.

Кроме того, я подумал, что это может быть случай кеша поиска, я включил динамическийкак хорошо, но результат тот же. Он должен был работать как 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

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

На самом деле это была проблема с динамическим кешем. NewLookupRow присваивается значение 0 для дубликатов, поэтому я добавил условие в фильтр как ISNULL (COMPANYID) AND NEWLOOKUPROW = 1 и, наконец, это сработало.

enter image description here

enter image description here

0 голосов
/ 03 ноября 2019

Преобразование «Уточняющий запрос» не имеет возможности узнать, что происходит при дальнейших преобразованиях в отображении. Он не может видеть результаты в самой цели, потому что кэш поиска загружается один раз в начале отображения, используя отдельное соединение с базой данных. Даже если вы отключите кэширование (это будет означать один запрос для каждой входной строки Lookup), данные не будут немедленно зафиксированы (поэтому не видны другим соединениям) при записи в целевой объект.

Вот причина использования динамического поискакеш, который работает путем добавления новых строк в кеш поиска. Однако в вашем случае есть ловушка: company_id создается после поиска (это правильное место), поэтому его нельзя добавить в кэш поиска.

Я думаю, вы могли бысконфигурируйте Lookup так, чтобы:

  • Вы активировали опции Dynamic Lookup Cache, Update Else Insert и Insert Else Update
  • . Вы используете company_name для сравнения исходных данных и Lookupdata
  • Вы создаете поддельное поле company_id со значением 0 перед Lookup и связываете его с соответствующим полем Lookup
  • . Вы ставите флажок Disable in comparison для поля company_id * 1022. *
  • Затем вы можете использовать предопределенное поле 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

...