删除 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 个不同的步骤:
- 一个映射将加载暂存 table 而不是您的最终目标 table,带有重复项
- 一个 ODI 过程,它将执行删除以删除暂存中的重复项 table
- 将数据从暂存区加载到目标的映射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;
我们在 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 个不同的步骤:
- 一个映射将加载暂存 table 而不是您的最终目标 table,带有重复项
- 一个 ODI 过程,它将执行删除以删除暂存中的重复项 table
- 将数据从暂存区加载到目标的映射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;