从大表中删除重复的行

时间:2011-11-29 18:02:09

标签: sql sybase

我有大表(~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且此行中的更新高于已删除行中的更新)

3 个答案:

答案 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
   )