как сделать специальное соединение слева от ODI между двумя таблицами

Я хотел бы соединить две таблицы (A и B), и я хочу вставить строки, которых нет в таблице B и которые не находятся на пересечении (как я показываю вам на рисунке), вставить их в таблицу B.

если я на sql, я могу сделать так:

SELECT *
FROM A
LEFT JOIN B ON A.key = B.key
WHERE B.key IS NULL

а на ОДИ. Я не могу этого сделать. Я только что создал левое внешнее соединение, но это не решило мою проблему, с помощью левого внешнего соединения я могу взять все строки, которые находятся в таблице A, и строки, которые находятся на пересечении между A и B.

Мне нужно просто извлечь все строки, которые находятся в таблице A, без строк, которые находятся на пересечении. как я могу исправить это на ODI

Большое вам спасибо за вашу помощь.


person Community    schedule 14.09.2015    source источник
comment
то есть вы имеете в виду, что если в таблице A есть 1,2,3, а в таблице B - 2,3,4, то вам нужен только 1?   -  person Utsav    schedule 14.09.2015
comment
Дал ответ ниже. Проверьте и дайте мне знать.   -  person Utsav    schedule 14.09.2015


Ответы (4)


Это должно работать:

  1. Вы можете создать внутреннее соединение для A.key = B.key в интерфейсе ODI.
  2. Отредактируйте это внутреннее соединение и замените условие соединения на A.key (+) = B.key.
  3. Сохраните интерфейс
  4. Создайте фильтр в интерфейсе с помощью WHERE B.key IS NULL
person Srinivasa Cholkar    schedule 29.08.2017

select col1,col2.... from A 
minus 
select col1,col2.... from B

ИЛИ если A и B имеют разную структуру, то

 select * from A 
 where A.key not in (select distinct(key) from B)
person Utsav    schedule 14.09.2015
comment
Я не хочу этого в SQL, я хочу использовать в Oracle Data Integrator, понимаете? - person ; 14.09.2015
comment
Вы можете сделать то же самое, используя два набора данных с оператором минус между ними в ODI 11g. Или используйте компонент SET, если вы используете ODI 12c. - person JeromeFr; 14.09.2015
comment
@JeromeFr Я использую ODI 12c OH да, я видел этот компонент набора, я буду использовать его, спасибо за вашу помощь - person ; 14.09.2015

Если вы используете ODI 11g, вы можете выполнить соединение в желтом (временном) интерфейсе, они повторно используют этот интерфейс в синем интерфейсе, где вы можете применить фильтр. Убедитесь, что вы выбрали «Использовать как производный оператор (подвыбор)» в источнике в синем интерфейсе. При этом желтый интерфейс будет подзапросом, и вы уверены, что фильтр применяется после соединения.

Если вы используете ODI 12c, вы можете выполнить объединение в компоненте набора данных и добавить фильтр к выходным данным набора данных. Таким образом, вы уверены, что фильтр применяется после соединения.

person JeromeFr    schedule 14.09.2015
comment
где мы можем использовать компонент Set? - person ; 14.09.2015
comment
Что мы можем сделать с набором данных - person ; 15.09.2015
comment
Компоненты "Набор данных" и "Набор" доступны на панели компонентов. В этой записи в блоге от команды ODI в Oracle объясняется, как использовать компоненты Set и Dataset. - person JeromeFr; 15.09.2015
comment
спасибо за ваш ответ, пожалуйста, вы знаете, как я могу создать временную таблицу для сопоставления, чтобы использовать ее временно - person ; 16.09.2015
comment
Это невозможно в ODI 12c. Вам нужно создать таблицу на уровне базы данных и выполнить ее реинжиниринг или создать хранилище данных вручную и иметь шаг в своем KM, который создаст целевую таблицу. - person JeromeFr; 17.09.2015

Вы должны иметь возможность заставить ODI генерировать SQL, который вы предоставляете, без необходимости прибегать к операциям на основе наборов (МИНУС), которые также должны работать лучше.

Можете ли вы убедиться, что вы разделили логику сопоставления и поместили условие A.key = B.key в JOIN и отдельный ФИЛЬТР B.key IS NULL?

person msciwoj    schedule 15.09.2015