删除 ODI 中 I$ table 中的重复项

Delete Duplicate in I$ table in ODI

我们在 ODI 中有一个加载计划。由于 I% table 中的重复记录,我们在某些情况下会出现重复错误。我们所做的是每次加载计划失败时手动 运行 脚本。

DELETE FROM adw12_dw. I$_1558911580_4
      WHERE     (EFFECTIVE_FROM_DT, DATASOURCE_NUM_ID, INTEGRATION_ID) IN
                    (  SELECT EFFECTIVE_FROM_DT,
                              DATASOURCE_NUM_ID,
                              INTEGRATION_ID
                         FROM adw12_dw . I$_1558911580_4
                     GROUP BY EFFECTIVE_FROM_DT,
                              DATASOURCE_NUM_ID,
                              INTEGRATION_ID
                       HAVING COUNT (1) > 1)
            AND ROWID NOT IN
                    (  SELECT MIN (ROWID)
                         FROM adw12_dw . I$_1558911580_4
                     GROUP BY EFFECTIVE_FROM_DT,
                              DATASOURCE_NUM_ID,
                              INTEGRATION_ID
                       HAVING COUNT (1) > 1)
                
                commit;

有没有办法自动删除集成中的重复记录table?

如果源中有重复项,最好在映射逻辑中进行处理。 可行的方法是添加一个表达式组件以添加一个 row_rank 列,使用分析函数对重复项进行排名:row_number() over (partition by EFFECTIVE_FROM_DT, DATASOURCE_NUM_ID, INTEGRATION_ID order by ROWID)。 然后,您可以添加条件为 row_rank = 1.

的过滤器

如果您希望在插入后进行删除,您可以编辑 IKM 并在加载目标之前添加删除步骤 table。

您还可以将集成分为 3 个不同的步骤:

  1. 一个映射将加载暂存 table 而不是您的最终目标 table,带有重复项
  2. 一个 ODI 过程,它将执行删除以删除暂存中的重复项 table
  3. 将数据从暂存区加载到目标的映射table

也许你的重复计数超过 2,因为我们必须递归地执行删除查询。例如:

CREATE OR REPLACE PROCEDURE delete_dublicates
IS
BEGIN
    DELETE FROM TABLE1 WHERE ID IN 
        (
            SELECT max(ID) FROM TABLE1
            GROUP BY USER_ID, TYPE_ID 
            HAVING count(*) > 1
        );

    IF (SQL%ROWCOUNT > 0) THEN 
        delete_dublicates;
    END IF; 

END delete_dublicates;