2017-02-26 81 views
0

我有一個奇怪的情況,我不知道它是如何發生的。如何通過其OID刪除記錄?

這是我的表:

id 
date 
amount 

其中id不能NULL,並自動增加。

有人去年系統創建了以下情況:

OID  id  date amount 
710604512 197 2015-03-11 10657.61 
710604513 197 2015-03-11 10657.61 

這造成了巨大的問題,ID應該是唯一的。
我無法解決這個問題,因爲我會做的任何操作都會在兩行上完成。

其中之一需要刪除。

刪除都和插入一個的解決方案是不可接受的,因爲我不能用時間(它記錄創建的日期和記錄將顯示它)

如何刪除該行通過其OID玩?

回答

2

如果你想刪除的記錄OID重複的情況發生,那麼你可以試試這個:

WITH cte AS (
    SELECT *, 
      ROW_NUMBER() OVER (PARTITION BY id, date, amount ORDER BY OID DESC) AS rn 
    FROM yourTable 
) 
DELETE FROM cte WHERE rn=2;  -- or rn >=2 to delete all duplicates 

爲了與更大OID刪除記錄,只是改變了ORDER BY條款對此:

ORDER BY OID 
+1

謝謝。我不知道我可以過濾OID – avi

1

假設您想要爲每個ID保留具有最大OID的行,可以使用t他:

delete 
from your_table t1 
    using (
     select id, max(OID) 
     from your_table 
     group by id 
     ) t2 
where t1.id = t2.id and t1.OID <> t2.OID; 

或者:

delete 
from your_table t1 
where exists (
    select 1 
    from your_table t2 
    where t1.id = t2.id 
    and t1.OID < t2.OID 
); 
1

如果id, date, amount在你的情況下,業務鍵,你可以通過這些列編組刪除超出第二的所有記錄。事情是這樣的:

DELETE FROM theTable 
WHERE OID IN (
    SELECT OID 
    FROM ( SELECT ROW_NUMBER() OVER (PARTITION BY id, date, amount) AS RowNo, OID 
      FROM tab) x 
    WHERE x.RowNo > 1); 

注:無論這應該重複的次數。