2009-12-31 36 views

回答

0

一種解決方案是寫打開遊標以由限定重複各列排序的查詢的過程中,並在該行是前一行的副本時使用DELETE ... WHERE CURRENT OF CURSOR。這裏是我的意思的僞代碼:

sql [ctx] C1 = { SELECT * FROM MyTable ORDER BY dup_column }; 

sql { FETCH C1 INTO row }; 
while (!C1.endFetch()) { 
    if (row.dup_column = prevrow.dup_column) { 
     sql [ctx] { DELETE FROM MyTable 
        WHERE CURRENT OF C1 }; 
    } 

    prevrow.dup_column = row.dup_column; 

    sql { FETCH C1 INTO ...  }; 
} 
C1.close(); 
0
delete from thetable where pk_column_name=pk_value; 
0
DELETE 
    T1 
FROM 
    My_Table T1 
INNER JOIN My_Table T2 ON 
    T2.duplicate_column = T1.duplicate_column AND 
    T2.pk_column > T1.pk_column -- You could make this "<" if you wanted too 

之後,你可能要考慮看​​你的數據庫設計,因爲它看起來像你有應該是唯一列但你沒有任何唯一約束。也許這應該是你的PK,或者至少在列上應該有一個唯一的約束。

因爲DB2可能不支持的上方,另一種選擇是使用一個子查詢:

DELETE 
FROM 
    My_Table 
WHERE 
    pk_column IN 
    (
      SELECT 
       T1.pk_column 
      FROM 
       My_Table T1 
      INNER JOIN My_Table T2 ON 
       T2.duplicate_column = T1.duplicate_column AND 
       T2.pk_column > T1.pk_column 
    ) 
+0

你在DB2上試過這個嗎? AFAIK,DB2不支持多表DELETE語法。這是對SQL的非標準擴展,由MySQL的。 – 2009-12-31 21:18:21

0

對於每個唯一行,找到最小的id,然後刪除所有剩餘的行。正如Tom H.所建議的那樣,一旦數據清理完畢,就向唯一的列添加一個唯一的約束/索引。

0

如果PK是不同的(讓我們假設名稱爲ID),那麼下面的語句刪除返回的ID

select b.ID as INCORRECT_ID 
    from TABLE A 
    join TABLE B on a.FIELD1 = b.FIELD1 and a.FIELD2 = b.FIELD2 (all fields but ID) 
    where B.ID > A.ID 

這樣,您可以通過

delete from TABLE where ID in (...aforementioned statement...) 

刪除它們,我不知道是什麼您使用的數據庫,因此可能需要一些語法調整。

相關問題