删除 ODI 中 I$ 表中的重复项
Posted
技术标签:
【中文标题】删除 ODI 中 I$ 表中的重复项【英文标题】:Delete Duplicate in I$ table in ODI 【发布时间】:2021-12-30 00:17:31 【问题描述】:我们在 ODI 中有一个加载计划。由于 I% 表中的重复记录,我们在某些场景中会出现重复错误。我们所做的是每次加载计划失败时手动运行脚本。
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;
有没有办法自动删除集成表中的重复记录?
【问题讨论】:
不看映射很难判断。这些重复来自我猜的来源?映射逻辑是什么?使用的 IKM 是什么,加载策略是什么? 【参考方案1】:如果源中有重复项,最好在映射逻辑中处理。
可行的方法是添加一个表达式组件来添加一个row_rank
列,使用分析函数对重复项进行排名:row_number() over (partition by EFFECTIVE_FROM_DT, DATASOURCE_NUM_ID, INTEGRATION_ID order by ROWID)
。
然后,您可以添加条件为row_rank = 1
的过滤器。
如果您希望在插入后进行删除,您可以编辑 IKM 并在加载目标表之前添加删除步骤。
您还可以将集成分为 3 个不同的步骤:
-
一个映射会加载一个临时表而不是您的最终目标表,并带有重复项
一个 ODI 过程,将执行删除以删除临时表中的重复项
将数据从暂存区加载到目标表的映射
【讨论】:
非常感谢@JeromeFR,非常感谢!【参考方案2】:也许您的重复计数超过 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$ 表中的重复项的主要内容,如果未能解决你的问题,请参考以下文章