如何删除db2数据库中的两个重复记录之一

时间:2009-12-31 20:47:59

标签: sql db2

我有一个要求,即除了PK之外我有两个具有相同值的记录。我怎么能删除其中一个。我有很多这样的重复记录。

5 个答案:

答案 0 :(得分:0)

delete from thetable where pk_column_name=pk_value;

答案 1 :(得分: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
     )

答案 2 :(得分: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();

答案 3 :(得分:0)

对于每个唯一行,找到最小的id,然后删除所有剩余的行。

delete 
  from MyTable 
  where rowId not in (
    select max or min(rowId)
      from MyTable
      group by column1, column2 /* these are the unique columns */ 
   )

清理数据后,像Tom H.建议的那样,为唯一列添加唯一约束/索引。

答案 4 :(得分: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... )

我不确定您使用的是什么数据库,因此可能需要进行一些语法调整。