我有大表(~1,000,000行),可能包含重复值。
该表包含两列(例如col a,col b),它们一起表示唯一键,ID和上次更新日期。
例如我可以有像:
这样的表格id | a | b |更新
1 | jon |史密斯| 1/1
2 |不要|史密斯| 2/5
3 |鲍勃|大卫| 1/1
4 |丹|刘易斯| 3/1
5 |鲍勃|大卫| 3/1
正如您在id 3和5中看到的那样,该表在a和b列中包含相同的值。 我想删除包含这种重复的行,但保留最后更新的行。
对于这个例子,删除后我会有这个表: id | a | b |更新
1 | jon |史密斯| 1/1
2 |不要|史密斯| 2/5
4 |丹|刘易斯| 3/1
5 |鲍勃|戴维斯| 3/1
(id = 3已删除,因为我已经有一个= bob和b = davis在行中,其中id = 5且此行中的更新高于已删除行中的更新)
答案 0 :(得分:2)
delete from MyTable
where exists (
select 1 from MyTable t2
where MyTable.a=t2.a and MyTable.b=t2.b and MyTable.upd<t2.upd
)
答案 1 :(得分:1)
下面的一个应该可以工作。
DELETE
FROM MYTABLE
WHERE ID IN(
SELECT M1.ID
FROM MYTABLE M1,
MYTABLE M2
WHERE M1.A = M2.A
AND M1.B = M2.B
AND M1.ID < M2.ID);
答案 2 :(得分:0)
您需要在WHERE子句中执行两次自引用。第一个标识具有重复项的行,第二个标识确保您没有删除最新版本。
DELETE
FROM TestCase
WHERE EXISTS (
-- Where there's more than one
SELECT 1
FROM TestCase AS Reference
WHERE TestCase.a = Reference.a
AND TestCase.b = Reference.b
AND TestCase.[update] <> Reference.[update]
)
AND TestCase.[update] <> (
-- and this isn't the most recent
SELECT Max (Reference2.[update])
FROM TestCase AS Reference2
WHERE TestCase.a = Reference2.a
AND TestCase.b = Reference2.b
GROUP BY Reference2.a,
Reference2.b
)