【问题标题】:informatica multi correlated subquery implementationinformatica 多相关子查询实现
【发布时间】:2017-01-20 12:53:21
【问题描述】:

我正面临一项任务,由于我缺乏使用 Informatica 组件(尤其是 SQL 转换)的经验,因此我尚未实施。 那么在 PowerCenter 中实现这种子查询的最佳方法是什么:

SELECT
   A.ID,
   NVL2(A.SACHKONTO, B.KLAMMER, A.ID) AS KLAMMER
FROM
Table1 A,
    (SELECT
       A.ID AS KLAMMER,
       B.ID
FROM
    (SELECT
        ID,
        ID AS VON_ID,
        LEAD(ID,1) OVER (ORDER BY ID) - 1 AS BIS_ID
    FROM
        Table1
    WHERE
        SACHKONTO IS NULL) A,
    Table1 B
WHERE
    B.ID BETWEEN A.VON_ID AND A.BIS_ID
) B
WHERE
  A.ID = B.ID

所以我尝试了不同的方法并取得了小成功。 第一个是在它的一小部分“分解”SQL(如有必要,我会参考或编辑问题)。 我还尝试将所有查询(在将其调整为 Informatica SQL“语言”之后,但没有成功。

这是我复制此类查询的最接近的解决方案,而不考虑性能的重要性(我确实在 SQ 中使用了 SQL 覆盖),但是从表结果来看,连接没有被正确处理,然后我相信我需要添加另一个管道才能以正确的顺序执行连接:

我的映射解决方案:

【问题讨论】:

    标签: sql subquery etl informatica-powercenter


    【解决方案1】:

    您可以将子查询放入查找转换中,然后匹配来自外部查询的记录(我假设这将是您根据原始 A.ID = B.ID 放入 zource 限定符的内容查询然后过滤空值)

    或者您也可以类似地使用 2 个源限定符(一个用于父查询,另一个用于子查询),然后使用普通连接类型的连接器转换。这种方式将比我的第一个选项更快地过滤您的源数据,因此性能方面应该会更好。

    最后的选择是使用与当前查询相同的带有 sql 覆盖的源限定符...在数据库中过滤记录,所以那里有一个加号(只要查询本身是最佳的),但 sql 覆盖在更广泛的映射上下文,可能会带来意想不到的惊喜,因此应谨慎使用。

    【讨论】:

    • 感谢您的回答。我仍然不明白如何在连接条件下实现“BETWEEN A.VON_ID AND A.BIS_ID”,这是我要进行 SQL 转换的第二个子查询的方式,但是不可能从 2 发送输入SQ(出现“在转换 SQL 时不允许连接”错误)
    • 我找到了一种解决方法,可以实现“介于”的逻辑。基本上,我在 Source 限定符中使用了 SQL 覆盖。我面临的不便仍然是与目标表不同的形式,其中行中的 SQL 是临时表(最后是 SQL 引擎的子库)。实际上,我创建了一个表来存储来自内部子查询的值,其中是来自前导函数的值。然后我必须为第二个子查询的“存储”值创建另一个表。
    • 这对我来说看起来并不真正高效,这并不意味着我需要拥有那些通常在架构中没有的附加表。这里有什么帮助吗?
    • 我不确定你为什么需要创建临时表(我正在使用 oracle db 并且没有看到 informatica 在那里创建临时表)
    • 您是否尝试过将完整的 sql 按原样提供到源限定符 sql 覆盖中,即不中断子查询?如果您能够调整源数据库上的索引,则应该是性能最高的选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    相关资源
    最近更新 更多