понедельник, 27 сентября 2010 г.

Поиск одинаковых JOIN-ов в ODI.

Иногда бывает нужно найти среди множества интерфейсов определенные соединения (join-ы). Например, при тестировании одного интерфейса обнаружилась ошибка при соединении таблицы фактов с одной из таблиц размерностей. В среде разработки таблица измерений имела только одну строку, подпадающую под условие соединения, а в тестовом окружении строк оказалось больше.

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



Можно исследовать этот вопрос на еще более глубоком уровне, и посмотреть, какие колонки нашей таблицы участвуют в качестве источника или приемника данных в каких объектах:


В этом смысле Oracle Data Integrator предоставляет очень удобные средства для анализа всех таблиц, задействованных в ETL процессе.

Но что делать, если такая таблица не одна? Или, как найти одинаковые условия соединения двух таблиц во всех интерфейсах проекта? Для этого я подготовил небольшой sql-скрипт, который, я думаю, будет полезен в этом случае:

SELECT
prj.Project_Name AS "PROJECT",
folder.folder_name AS "FOLDER",
itf.pop_name AS "INTERFACE",
tab1.table_name AS "TABLE 1",
tab2.table_name AS "TABLE 2",
cond.txt AS "CONDITION",
CASE WHEN clause.Join_Type = 'C' THEN 'CROSS JOIN' ELSE
CASE WHEN clause.clause_type = 3 THEN 'Filter' ELSE
CASE
WHEN clause.ind_outer1 = 0 AND clause.ind_outer2 = 0 THEN 'INNER JOIN'
WHEN clause.ind_outer1 = 0 AND clause.ind_outer2 = 1 THEN 'RIGHT OUTER JOIN'
WHEN clause.ind_outer1 = 1 AND clause.ind_outer2 = 0 THEN 'LEFT OUTER JOIN'
WHEN clause.ind_outer1 = 1 AND clause.ind_outer2 = 1 THEN 'FULL JOIN'
END END END AS "JOIN TYPE"
FROM SNP_POP_CLAUSE clause
LEFT OUTER JOIN snp_txt cond ON cond.I_TXT = clause.i_Txt_Sql
LEFT OUTER JOIN snp_source_tab tab1 ON tab1.i_source_Tab = clause.i_Table1
LEFT OUTER JOIN snp_source_tab tab2 ON tab2.i_source_Tab = clause.i_Table2
LEFT OUTER JOIN snp_pop itf ON itf.i_pop = clause.i_Pop
LEFT OUTER JOIN snp_folder folder ON folder.i_Folder = itf.i_folder
LEFT OUTER JOIN snp_project prj ON prj.i_project = folder.i_project
WHERE 1 = 1
--AND itf.pop_name = 'Наименование интерфейса'
--AND cond.txt = 'Условие соединения таблиц'
--AND prj.Project_Name = 'Наименование проекта'
--AND (tab1.table_name = 'Наименование таблицы, участвующей в соединении' OR tab2.table_name = 'Наименование таблицы, участвующей в соединении')
-- AND folder.folder_name = 'Наименование папки, в которой находится интерфейс'


Основные сведения о джоинах и фильтрах для интерфейсов Oracle Data Integrator хранит в репозитории в таблице SNP_POP_CLAUSE. Остальные таблицы присоединены для удобства фильтрации.

Модифицируйте скрипт и просто добавьте свои условия, по которым необходимо фильтровать выборку и, при необходимости, исправьте синтаксис запроса, если ваш репозиторий установлен не в БД Oracle.

См. также: структура таблиц рабочего репозитория ODI.

Комментариев нет:

Отправить комментарий