2014-01-25 51 views
0

我有一個非常大的表,其中包含從多個系統收集的數據。我現在必須根據條件和多列刪除重複記錄。Oracle如何刪除基於多個數據庫列和條件的重複項

下面是一個例子:

+---------------+-------------+------+-----+-------- 
| System ID  | Debt Num | Exp Dt | Account NO | 
+---------------+-------------+------+-----+--------- 
| pay   | 2222  | 0114 | 111  | 
| pay   | 2222  | 0214 | 111  | 
| Online  | 2222  | 0214 | 111  | 
| Online  | 3333  | 0115 | 222  | 
| Online  | 3333  | 0116 | 222  | 
| ERP   | 2222  | 0214 | 111  | 
| ERP   | 4444  | 0114 | 333  | 
+---------------+-------------+------+-----+-------- 

從以上數據,以滿足以下條件刪除重複。

  • 通過借方num,exp dt,account-no刪除重複行組,並使用max(exp dt)保留一條記錄。
  • 要保留的記錄基於優先級爲System ID。 1)支付2)在線和3)ERP。在上面的帳戶111中,我們有來自所有三個系統的記錄,並且借記卡的max(exp dt)是所有三個系統中的0214。只有Pay與exp dt = 0214的記錄應該保留,並且休息應該被刪除。
  • 如上面的帳戶222示例,我們沒有來自薪酬的記錄,因此優先考慮系統Online和保留max(exp dt)的ERP。

我已經嘗試過在線查找多個查詢,比如group by,row_number,但都滿足一個條件。

感謝您的幫助,貢獻您的想法和建議。

EDIT:戈登的查詢工作正常,符合我的要求,但是當我在包含540K行的分段上運行相同時,它錯誤地出現了ORA-00600內部錯誤。

+0

你看過Oracle MERGE命令嗎? – scraatz

+0

@scraatz直到現在。我只是看了一下例子'merge into when matched .. when not match from http://www.oracle-base.com/articles/10g/merge-enhancements-10g.php。它是否正確?你有更好的參考嗎?順便說一句,好的想法和好建議。我會嘗試。 – dicaprio

+0

對不起,我最近才發現它試圖解決類似的問題。我搜索了「從聯接中刪除oracle」,就像其他數據庫一樣,您可以從連接的表中刪除這在Oracle上是不可能的。 – scraatz

回答

1

我認爲你可以rowid和相關子查詢做到這一點:

delete from payinfo_staging_db 
    where rowid <> (select rowid 
        from (select rowid 
         from payinfo_staging_db t2 
         where t2.debitNum = payinfo_staging_db.debitNum and 
           t2.accountNo = payinfo_staging_db.accountNo 
         order by t2.exp_dt, 
            (case when t2.SystemId = 'Pay' then 1 
             when t2.SystemId = 'Online' then 2 
             when t2.SystemId = 'ERP' then 3 
            end) 
         ) r 
        where rownum = 1 
       ); 

編輯:

必須有與甲骨文嵌套引用的一個問題。 (在它解析並執行正確的意義至少)以下工作:

delete from payinfo_staging_db 
    where rowid <> (select min(rowid) keep (dense_rank first order by exp_dt desc, 
                  (case when t2.SystemId = 'Pay' then 1 
                    when t2.SystemId = 'Online' then 2 
                    when t2.SystemId = 'ERP' then 3 
                  end) 
             ) as therowid 
        from payinfo_staging_db t2 
        where t2.debitNum = payinfo_staging_db.debitNum and 
         t2.accountNo = payinfo_staging_db.accountNo 
       ); 

的SQL小提琴是here

+0

我嘗試了上面的提示並注意到錯誤t.debitNum:invalid identified。子查詢中的表別名「t」是否有效? – dicaprio

+0

桌子的名字是什麼? –

+0

我的表名是payinfo_staging_db,我從't'取代''payinfo_staging_db t''與'從tt2'相同'從payinfo_staging_db t2'。希望這是正確的。 – dicaprio

相關問題