需要哪些组件以及如何传输此查询以在 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 之间使用 [重复]

如何编写此查询以在 Sql Server 中获得更好的性能?删除子字符串行

来自 ODI 的 OBIEE BI 服务器种子缓存

Loading Data From Oracle To Hive By ODI 12c