我們在 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;
有沒有辦法自動洗掉集成表中的重復記錄?
uj5u.com熱心網友回復:
如果源中有重復項,最好在映射邏輯中處理。可行的是添加一個運算式組件以row_rank使用分析函式添加一列來對重復項進行排名:row_number() over (partition by EFFECTIVE_FROM_DT, DATASOURCE_NUM_ID, INTEGRATION_ID order by ROWID)。然后,您可以添加帶有條件的過濾器row_rank = 1。
如果您更喜歡在插入后進行洗掉,則可以在加載目標表之前編輯 IKM 并添加洗掉步驟。
您還可以將集成分為 3 個不同的步驟:
- 將加載臨時表而不是最終目標表的映射,并帶有重復項
- 一個 ODI 程序,它將執行洗掉以洗掉臨時表中的重復項
- 將資料從暫存區加載到目標表的映射
uj5u.com熱心網友回復:
也許您的重復次數超過 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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/361898.html
上一篇:結果集未正確關閉
