2016-07-19 1 views
1

Я использую Talend Open Studio для интеграции данных, чтобы создать работу, которая, как предполагается сделать следующее:Добавить строку в многие ко многим таблице отношений после создания строки с Talend

  1. Получить строку из table1
  2. Если строка с определенным значением не существует в таблице 2: добавьте строку в таблицу2
  3. добавьте строку во таблицу отношений «многие ко многим», используя идентификатор из строки таблицы и идентификатора из таблицы2 (существующей или вновь созданной) строка

, например, скажем, у меня есть таблицы PROFILE, USER и REL_PROFILES_USERS, мне нужно заполнить USER начиная с PROFILE и каждый PROFILE ряд с тем же именем будет связан с тем же USER

так я начать с PROFILE таблица

id | name | address 
----------------------------------- 
    1 | jsmith | 1234 Main Street 
    2 | jasonp | 321 Secondary Street 
    3 | jsmith | NULL 

и я хочу, чтобы в конечном итоге с USER popuplated этот путь

id | username 
---------------- 
    1 | jsmith 
    2 | jasonp 

и REL_PROFILES_USERS

user | profile 
---------------- 
    1 | 1 
    1 | 3 
    2 | 2 

мне удалось сделать пункт 1. и 2. с помощью простого TMAP между PROFILE и USER и я заселением REL_PROFILES_USERS после первого tMap с использованием отдельного подзадания с tMap и а внутренним соединением на все матчи между USER и PROFILE на PROFILE.name = USER.username.

Что бы я хотел сделать, это заполнить REL_PROFILE_USERS в том же подзагороде, где я заполняю ПОЛЬЗОВАТЕЛЬ, вскоре после того, как новая строка была вставлена ​​или когда вы видите уже существующую строку, не зная о связи между USER и ПРОФИЛЬ (это имя пользователя = имя), но только потому, что я работаю над этими строками

+0

Как выглядит ваша работа? – tobi6

+2

Сделайте это за 2 прохода. 1-й проход фильтрует отдельных пользователей из вашего потока.Затем присоедините это к целевой таблице. В tMap catch inner join reject -> у вас есть пользователи, которых нет в вашей таблице. Добавьте этих пользователей в свою таблицу. Второй проход, присоединитесь к таблице пользователей с вашим потоком ввода. –

ответ

1

Привет, вы не указали, какую базу данных вы используете, поэтому я собираюсь предположить MS SQL для обсуждения. Talend имеет эквивалент компоненты базы данных для основных баз данных, а также общий JDBC для чего-либо еще.

Я предлагаю попробовать этот поток

tMSSqlInput (из профиля) ->tMSSqlOutput (на пользователе) ->tMSSqlLastInsertId (чтобы получить вставленный идентификатор) -> tMSSqlOutput (на ref_profiles_user)

В качестве альтернативы, вы могли бы включите идентификационную вставку в tMsSqlOutput, на первой вставке. Таким образом, вы знаете PK строки, вставленной в таблицу пользователя. Затем вы можете перейти к вставке в таблицу rel_users_profile. Я рекомендую не создавать свой собственный ПК для 1-й таблицы, если только это не единственный процесс, который вставляет записи в эту таблицу. Вызов последовательности в базе данных для получения следующего порядкового номера немного более безопасен, чем создание собственного seq.

tMSSqlInput (из профиля) -> (генерировать идентификатор, возможно, путем вызова получить следующую последовательность или создать свой собственный в TMAP) -> tMSSqlOutput (на пользователя) -> tMSSqlOutput (на ref_profiles_user)

Весело и удачи ,

+0

Привет, спасибо за ваш ответ, мне интересно, как получить profile_id. Вы правильно догадались о БД, это MS SQL. – valepu

+0

. Вы получаете profile_id в первом tMsSqlInput, используя запрос типа «SELECT id, name, address FROM profile». – dbh

+0

См. Обновленные имена таблиц в потоке примера в соответствии с вашим сценарием. – dbh

Смежные вопросы