我有一个要求,即除了PK之外我有两个具有相同值的记录。我怎么能删除其中一个。我有很多这样的重复记录。
答案 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... )
我不确定您使用的是什么数据库,因此可能需要进行一些语法调整。