2017-02-26 18 views
0

私はそれがどうなったか分かりません。OIDでレコードを削除するには?

これが私のテーブルです:

idは NULLすることはできず、自動増加している
id 
date 
amount 

。これが原因

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

IDとして巨大な問題は一意である必要があります。

誰かが昨年システムは、次のような状況を作成しました。
これを通常のSQLから修正することはできません。これは、実行する操作が両方の行で行われるためです。

これらのうちの1つを削除する必要があります。

私は日付を再生することはできませんとの両方を削除し、1を挿入する解決策が受け入れられない(それは作成日を記録したログが表示されます)

どのように私はそのOIDで行を削除することができますか?ただORDER BY句を変更、大きい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 

答えて

2

あなたが小さいOIDでレコードを削除したい場合は、重複が発生した場合、あなたはこれを試すことができますこれまで:

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場合は、これらの列でグループ化することにより、第2を超えたすべてのレコードを削除することができます。このような何か:

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); 

注:これは、重複の数に関係なく動作するはずです。