需要哪些组件以及如何传输此查询以在 ODI 中使用?
Posted
技术标签:
【中文标题】需要哪些组件以及如何传输此查询以在 ODI 中使用?【英文标题】:what would the components needed and how do I transfer this query to be used in ODI? 【发布时间】:2021-08-28 17:30:16 【问题描述】:我对 ODI(Oracle 数据集成器)很陌生,学习如何进行基本映射和过滤器,来自源 -> 目标表的表达式,但这次我有这样的查询,我应该将其转换为 Oracle 中的映射。
WITH OUTER_QRY AS
(
SELECT T1.DATA_ID, T1.EMP_ID, T1.EMP_STORE, T1.HIRED_DATE, T1.EMP_STATUS
FROM L_EMPLOYEES T1
WHERE 1=1
AND T1.DATA_CREATE_DATE_TIME IN (SELECT MAX(DATA_CREATE_DATE_TIME)
FROM L_EMPLOYEES T2
WHERE T2.EMP_ID = T1.EMP_ID
AND T2.EMP_STORE = T1.EMP_STORE
AND T2.HIRED_DATE = T1.HIRED_DATE
)
AND T1.EMP_STATUS = 'REMOVED'
AND T1.EMP_ID = '123456789' -- used to query smaller data as example
)
SELECT EMP_ID, EMP_STORE, HIRED_DATE, FILED_DATE
FROM L_EMPLOYEES LE
WHERE 1=1
and (LE.EMP_ID, LE.EMP_STORE, LE.HIRED_DATE) NOT IN (SELECT EMP_ID, EMP_STORE, HIRED_DATE FROM OUTER_QRY)
AND LE.EMP_STATUS = 'ACTIVE'
AND LE.EMP_ID = '123456789' -- used to query smaller data as example
group by EMP_ID, EMP_STORE, HIRED_DATE, FILED_DATE
ORDER BY HIRED_DATE
;
首先,由于我们两次使用同一个表并且有一个外部查询,我想我可以做一些事情,比如加入这两个表,然后用这个作为条件过滤它们。
所以结构看起来像两个源表(同一个表)通过一个连接组件连接在一起 -> 过滤器 -> 表达式 -> 目标表
下面是第一个过滤条件中的内容,它确实给了我准确的解决方案,就好像我只为外部查询进行查询
1=1
AND L_EMPLOYEES_T1.DATA_CREATE_DATE_TIME IN (SELECT MAX(L_EMPLOYEES_T2.DATA_CREATE_DATE_TIME)
FROM L_EMPLOYEES_T1
WHERE L_EMPLOYEES_T2.EMP_ID = L_EMPLOYEES_T1.EMP_ID
AND L_EMPLOYEES_T2.EMP_STORE = L_EMPLOYEES_T1.EMP_STORE
AND L_EMPLOYEES_T2.HIRED_DATE = L_EMPLOYEES_T1.HIRED_DATE
)
AND L_EMPLOYEES_T1.EMP_STATUS = 'REMOVED'
AND L_EMPLOYEES_T1.EMP_ID = '123456789' -- used to query smaller data as example
我想这样,我可以在表达式和目标表之间插入另一个过滤器,这样表达式就可以用作外部查询
1=1
and (L_EMPLOYEES_T1.EMP_ID, L_EMPLOYEES_T1.EMP_STORE, L_EMPLOYEES_T1.HIRED_DATE) NOT IN (SELECT EMP_ID, EMP_STORE, HIRED_DATE FROM EXPRESSION)
AND L_EMPLOYEES_T1.EMP_STATUS = 'ACTIVE'
AND L_EMPLOYEES_T1.EMP_ID = '123456789' -- used to query smaller data as example
但是上面的内容不起作用,表达式不是表格。 我尝试通读子查询过滤器组件的文档,我不确定它是否正确使用,但玩了一下,也无法让它工作,因为找不到表或操作无效。
有没有人有任何建议/建议进行这种映射的正确方法是什么?
提前感谢您的任何建议。
【问题讨论】:
【参考方案1】:子查询过滤器组件确实是您的解决方案。 在“属性”窗格中,转到“条件”选项卡并输入一个子查询过滤条件,如下所示:
NOT IN (
SELECT EMP_ID, EMP_STORE, HIRED_DATE FROM FROM L_EMPLOYEES T1
WHERE 1=1
AND T1.DATA_CREATE_DATE_TIME IN (SELECT MAX(DATA_CREATE_DATE_TIME)
FROM L_EMPLOYEES T2
WHERE T2.EMP_ID = T1.EMP_ID
AND T2.EMP_STORE = T1.EMP_STORE
AND T2.HIRED_DATE = T1.HIRED_DATE
)
AND T1.EMP_STATUS = 'REMOVED'
)
另一种方法是使用 sql override 方法:
在画布上只拖放一次L_EMPLOYEES
数据存储并将其连接到您的目标。
转到“物理”选项卡并单击源数据存储
在“属性”窗格中,转到“提取选项”选项卡
将您的整个查询(如您在上面的问题中发布)设置为 CUSTOM_TEMPLATE 选项的值
这篇博文中有一个例子:https://blogs.oracle.com/dataintegration/odi-12c-sessionizing-data-with-matchrecognize-and-sql-override
不应滥用此方法,因为它在 ODI 中的视觉效果较差,因此更难维护。但是当查询很复杂时使用它是一个很好的工具,因为这里就是这种情况。
【讨论】:
以上是关于需要哪些组件以及如何传输此查询以在 ODI 中使用?的主要内容,如果未能解决你的问题,请参考以下文章
Node.js MySql如何知道用户ID以在登录后的查询中使用它
如何有效地查询多个表以在 dataGrid 中生成 excel STYLE 报告
如何修改此查询以在 startindex 和 endindex rownum 之间使用 [重复]