Преобразование для выбора таблицы данных на основе значения в отдельной таблице

У меня есть три таблицы (источник Oracle), назовем их таблицами 1, 2 и 3.

Я хотел бы проверить логическое поле в таблице 1, и если это T, я хочу только данные из таблицы 2, а если это F, я хочу только таблицу 3.

Какое преобразование было бы наиболее эффективным для этого и как мне его реализовать?

Я экспериментирую с преобразованиями Filter, Java и Expression, но если выражения проверяются построчно, то кажется излишним выполнение выражения для каждой строки вместо простой проверки один раз и использования соответствующую таблицу.

В обеих таблицах 2 и 3 есть поле с одинаковым именем, и я хочу, чтобы это поле было только для одной из таблиц, исходя из условия.


person JWiley    schedule 09.01.2013    source источник
comment
@MarekGrzenkowicz У них похожая структура, но не одинаковая. В обеих таблицах 2 и 3 есть поле с одинаковым именем, и я хочу, чтобы это поле было только для одной из таблиц, исходя из условия. На самом деле я не отдаю предпочтение количеству сопоставлений, в зависимости от того, что быстрее, если это имеет значение, если бы мне пришлось выбирать, я бы сказал, одно сопоставление.   -  person JWiley    schedule 09.01.2013


Ответы (1)


Создайте сопоставление, подобное следующей диаграмме:

src_TABLE2 --> sq_TABLE2 --|
                           |--> union --> (further processing)
src_TABLE3 --> sq_TABLE3 --|

и используйте следующие Source Filter условия* в квалификаторах источника:

-- for sq_TABLE2
'T' = ( SELECT FLAG FROM TABLE1 )

-- for sq_TABLE3
'F' = ( SELECT FLAG FROM TABLE1 )

В сопоставлении есть две исходные таблицы, и преобразование объединения объединяет данные из этих двух конвейеров. Однако из-за условий фильтрации в любой момент времени данные будут получены только из одной из исходных таблиц.

* Source Filter — это атрибут на вкладке Свойства квалификатора источника. Заданное здесь условие добавляется к предложению WHERE оператора SELECT, отправляемого в базу данных.

person Marek Grzenkowicz    schedule 09.01.2013
comment
Не могли бы вы подробнее рассказать о том, как вы использовали/настроили условия для квалификаторов источника? - person JWiley; 10.01.2013
comment
Итак, вы говорите, что я должен поставить SELECT FLAG FROM TABLE1 в квалификаторе источника без каких-либо сопоставлений из TABLE1 в TABLE2/TABLE3? Это означает, что мне не нужно связывать два квалификатора/источника? - person JWiley; 14.01.2013
comment
@JWiley Да, вы должны поместить этот запрос (вместе с = 'T' или = 'F') в квалификаторы источника для TABLE2 и TABLE3. Отображение не обязательно должно содержать квалификатор источника для TABLE1, вам вообще не нужно определение источника для этой таблицы. Вы можете указать любое условие (со сложными вложенными операторами SELECT, ссылающимися на любую таблицу или схему, которые вам нужны). Пока результирующий запрос - SELECT ports FROM sq_table WHERE source_filter - действителен, он будет отправлен в базу данных и выполнен. Вы пытались это реализовать? Вы пытались решить какую-либо проблему? - person Marek Grzenkowicz; 15.01.2013
comment
@JWiley Проверьте сами: возьмите любое работающее сопоставление, поместите 0 = 1 в свойство Source Filter его квалификатора источника, обновите сеанс и запустите его. Никакие строки не будут извлечены из базы данных. - person Marek Grzenkowicz; 15.01.2013
comment
Да, я просто хотел уточнить. Мои требования несколько раз менялись с момента публикации, поэтому я все еще разрабатывал, как его применить. - person JWiley; 15.01.2013