2014-09-11 27 views
0

我必須刪除每個帳戶+ date_added組合的數據,這些數據超過N天。 通過N天的時候,它意味着此處刪去比第一N個不同出現較老的上述組合刪除N天以前的不同條目

DELETE 
FROM tbl_check 
    WHERE 
    N < (SELECT count(DISTINCT date_added) + 1 
    FROM tbl_check b 
    WHERE b.ACCOUNT_NUMBER = tbl_check.ACCOUNT_NUMBER 
    AND tbl_check.date_added < b.date_added) 

此查詢必須在兩者的Sybase ASE和Oracle運行。我已經寫過上面的查詢,它試圖模擬DENSE_RANK,並且正在根據排名成功刪除。

但是,它不使用任何索引,並且也是執行FTS的相關查詢。該表中可能有成千上萬行。 enter image description here

有複合PK是:FOREIGN_KEY_COL,ACCOUNT_NUMBER,DATE_ADDED .. 這是查詢勝任工作,或者我們可以改進後,它給予相同的查詢具有如提到的兩個數據庫工作。

+0

也有一些方法,使這項刪除那些緩存將是很好 – fortm 2014-09-11 14:25:37

回答

0

爲什麼你不用下面的查詢;

DELETE FROM tbl_check where (getdate()-date_added)> N 
+0

這是因爲DATE_ADDED不相同每個ACCOUNT_NUMBER等的帳戶1,data_added可能是SYSDATE,SYSDATE -1,-2 SYSDATE。 Account2只能有SYSDATE -2,SYSDATE -4,SYSDATE -5。如果N = 2,那麼在清理之後,Account1應該刪除SYSDATE -2,而account2應該刪除SYSDATE -5 – fortm 2014-09-11 18:53:57